Python datetime.utcnow()返回不正确的日期时间

Python datetime.utcnow() returning incorrect datetime

1
datetime.utcnow()

此调用返回的日期时间不正确,从UTC/GMT延迟了1小时(签入:http://www.worldtimeserver.com/current_time_in_utc.asp)。

它能正常工作吗?

例如,它现在正在返回:

1
2015-02-17 23:58:44.761000.

当前的UTC时间是:00:58,而不是23:58


datetime.utcnow()使用OS提供的值。

datetime.utcnow()在python 2上使用gettimeofday(2)time.time()(和gmtime(3)将结果转换为分解时间)。

time.time()使用gettimeofday(2)ftime(3)time(2)。新的cpython版本可以使用clock_gettime(2)GetSystemTimeAsFileTime()

您可以按如下方式检查自我一致性:

1
2
3
4
5
6
7
#!/usr/bin/env python
import time
from datetime import datetime, timedelta

print(datetime.utcnow())
print(datetime(1970, 1, 1) + timedelta(seconds=time.time()))
print(datetime(*time.gmtime()[:6]))

以下是基于cpython源代码在Windows上调用GetSystemTimeAsFileTime()的(未测试)代码:

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python
import ctypes.wintypes
from datetime import datetime, timedelta

def utcnow_microseconds():
    system_time = ctypes.wintypes.FILETIME()
    ctypes.windll.kernel32.GetSystemTimeAsFileTime(ctypes.byref(system_time))
    large = (system_time.dwHighDateTime << 32) + system_time.dwLowDateTime
    return large // 10 - 11644473600000000

print(datetime(1970, 1, 1) + timedelta(microseconds=utcnow_microseconds()))

下面是在python2上调用clock_gettime()的代码。


我知道我回答这件事已经非常晚了。

我最近尝试过这样做,因此我建议使用datetime.now()而不是datetime.utcnow()。对于我的简单应用程序,它工作得很好。


问题只在UTC时间(python3)发生。

例如,系统时间:

1
2
3
$ date

Wed Jul 15 10:44:26 BST 2015

使用datetime.now()时python时间正确:

1
2
3
>>> datetime.now()

datetime.datetime(2015, 7, 15, 10, 44, 30, 775840)

…但在使用datetime.utcnow()时一小时内不正确:

1
2
3
>>> datetime.utcnow()

datetime.datetime(2015, 7, 15, 9, 44, 32, 599823)

UTC的问题是它不知道我的时区。

你必须在一个叫做pytz的时区模块的帮助下告诉它:

1
2
3
4
5
>>> import pytz
>>> mytz = pytz.timezone('Europe/London')
>>> pytz.utc.localize(datetime.utcnow(), is_dst=None).astimezone(mytz)

datetime.datetime(2015, 7, 15, 11, 3, 43, 688681, tzinfo=<DstTzInfo 'Europe/London' BST+1:00:00 DST>)

参考文献:

PYTZ-将UTC和时区转换为本地时间

https://opensourcehacker.com/2008/06/30/relativity-of-time-defects-in-python-datetime-and-workaround/

http://sweemengs-tech-world.blogspot.co.uk/2010/05/get-correct-datetime-value-for-python.html

http://bugs.python.org/issue5094)