Python datetime.utcnow()返回不正确的日期时间
datetime.utcnow()
此调用返回一个不正确的日期时间,从UTC/GMT延迟1小时(签入:http://www.worldtimeserver.com/current_time_in_UTC.asp)。它的工作方式应该是?Python datetime.utcnow()返回不正确的日期时间
例如,它的返回,现在:
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()
。
你可以检查自洽如下:
#!/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 based on CPython source呼吁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()))
下面是调用clock_gettime()
on Python 2代码。
问题只发生在utc时间(Python3)。
例如系统时间:
$ date
Wed Jul 15 10:44:26 BST 2015
Python的时间正确使用datetime.now时():
>>> 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 - Converting UTC and timezone to local time
http://sweemengs-tech-world.blogspot.co.uk/2010/05/get-correct-datetime-value-for-python.html
为什么你认为'utcnow()'不正确?除非你的本地时区有零utc偏移量; utc时间将与当地时间有所不同。无关:您可以使用'datetime.now(timezone)'来获取给定时区的当前时间。您提供的参考资料不好。对于第一个;在那里阅读我的评论。 – jfs 2015-07-16 18:44:14
目前还不清楚为什么你提供了*“datetime缺少UTC的具体tzinfo实现”的链接* Python问题(它在Python 3中修复;在Python 2中很容易解决;它根本不是问题你已经在使用'pytz')。 – jfs 2015-07-16 18:49:56
我的回答显示utcnow()是不正确的。距离我的系统时间1小时。我通过阅读墙上的时钟来验证这一点。链接仅仅是我用来寻找解决方案的。其他读者可能会发现它们有用/有趣。他们可能不符合高标准,J.F.,但他们给了我解决问题所需的信息,并使Python3给我一个正确的时间。就我而言,我的帖子最初包含了一个关于Python bug未被修复的尖刻评论,因为我必须查找一个修复程序,并将该修复程序称为pytz。但它已经消失了。咩。 – markling 2015-07-16 20:41:52
我知道我对这个回答非常迟。
我已经试过最近在做这一点,因此我建议使用的datetime.utcnow()
datetime.now()
代替。对于我的简单应用程序,工作正常。
你的时区是什么时区? – ozgur 2015-02-18 00:37:49
'time.timezone'说的是什么,它是你的时区的正确偏移量(以秒为单位)? – unutbu 2015-02-18 00:42:38
它说10800.什么是我的时区正确的抵消? – 2015-02-18 00:46:51