Python的datetime.utcnow()返回了错误的日期时间

11 浏览
0 Comments

Python的datetime.utcnow()返回了错误的日期时间

datetime.utcnow()

这个调用返回的日期时间不正确,比UTC / GMT晚1个小时(请在此处检查:http://www.worldtimeserver.com/current_time_in_UTC.asp)。

它是否正常工作?

例如:它现在返回:

2015-02-17 23:58:44.761000.

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

admin 更改状态以发布 2023年5月24日
0
0 Comments

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

datetime.utcnow()在Python 2上使用gettimeofday(2)time.time()(并使用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]))

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

#!/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()))

以下是在Python 2上调用clock_gettime()的代码

0
0 Comments

我知道我晚了五年,但今晚我遇到了同样的问题。根据我的经验,解决问题的方法是使用显式指定时区的UTC日期时间:

utc_dt_aware = datetime.datetime.now(datetime.timezone.utc)

如果你在谷歌上搜索"utcnow() wrong",这个是返回的第一个结果,所以我还是回答一下这个问题吧。

0