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

问题描述 投票:0回答:5
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

python python-2.7 datetime utc
5个回答
84
投票

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

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

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


15
投票

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]))

这是(未经测试的)代码,在 Windows 上调用

GetSystemTimeAsFileTime()
基于 CPython 源代码

#!/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
投票

utcnow
已弃用

更换这个

datetime.utcnow()

有了这个

from datetime import datetime, timezone

datetime.now(timezone.utc)

-8
投票

问题仅出现在 utc 时间 (Python3) 中。

例如系统时间:

$ date

Wed Jul 15 10:44:26 BST 2015

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

>>> datetime.now()

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

...但是使用 datetime.utcnow() 时错误一小时:

>>> datetime.utcnow()

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

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

你必须借助名为 pytz 的时区模块来告诉它:

>>> 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-shortcomings-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


-8
投票

我知道我回复这个问题已经太晚了。

我最近尝试这样做,因此我建议使用

datetime.now()
而不是
datetime.utcnow()
。对于我的简单应用程序来说,效果很好。

© www.soinside.com 2019 - 2024. All rights reserved.