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

Joh*_*mes 10 python datetime utc python-2.7

datetime.utcnow()
Run Code Online (Sandbox Code Playgroud)

此调用返回的日期时间不正确,从UTC/GMT延迟1小时(请登录:http://www.worldtimeserver.com/current_time_in_UTC.asp).

它应该像它应该的那样工作吗?

例如,它现在正在返回:

2015-02-17 23:58:44.761000.
Run Code Online (Sandbox Code Playgroud)

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

小智 31

我知道我迟到了五年,但今晚我遇到了同样的问题。根据我的经验,问题的解决方案是使用感知 UTC 日期时间:

utc_dt_aware = datetime.datetime.now(datetime.timezone.utc)
Run Code Online (Sandbox Code Playgroud)

如果你用谷歌搜索“utcnow() 错误”,这是你得到的第一个结果,所以我认为无论如何回答都会很好。


jfs*_*jfs 10

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

datetime.utcnow()使用gettimeofday(2)time.time()在Python 2上(gmtime(3)并将结果转换为细分时间).

time.time()使用gettimeofday(2),ftime(3),time(2).较新的CPython版本可能会使用clock_gettime(2),GetSystemTimeAsFileTime().

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

#!/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]))
Run Code Online (Sandbox Code Playgroud)

这是基于CPython源GetSystemTimeAsFileTime()在Windows 调用的(未经测试的)代码:

#!/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()))
Run Code Online (Sandbox Code Playgroud)

这是调用clock_gettime()Python 2的代码.