2015-02-18 116 views
4
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

感谢,

+0

你的时区是什么时区? – ozgur 2015-02-18 00:37:49

+0

'time.timezone'说的是什么,它是你的时区的正确偏移量(以秒为单位)? – unutbu 2015-02-18 00:42:38

+0

它说10800.什么是我的时区正确的抵消? – 2015-02-18 00:46:51

回答

5

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代码。

-3

问题只发生在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

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

+1

为什么你认为'utcnow()'不正确?除非你的本地时区有零utc偏移量; utc时间将与当地时间有所不同。无关:您可以使用'datetime.now(timezone)'来获取给定时区的当前时间。您提供的参考资料不好。对于第一个;在那里阅读我的评论。 – jfs 2015-07-16 18:44:14

+1

目前还不清楚为什么你提供了*“datetime缺少UTC的具体tzinfo实现”的链接* Python问题(它在Python 3中修复;在Python 2中很容易解决;它根本不是问题你已经在使用'pytz')。 – jfs 2015-07-16 18:49:56

+0

我的回答显示utcnow()是不正确的。距离我的系统时间1小时。我通过阅读墙上的时钟来验证这一点。链接仅仅是我用来寻找解决方案的。其他读者可能会发现它们有用/有趣。他们可能不符合高标准,J.F.,但他们给了我解决问题所需的信息,并使Python3给我一个正确的时间。就我而言,我的帖子最初包含了一个关于Python bug未被修复的尖刻评论,因为我必须查找一个修复程序,并将该修复程序称为pytz。但它已经消失了。咩。 – markling 2015-07-16 20:41:52

-1

我知道我对这个回答非常迟。

我已经试过最近在做这一点,因此我建议使用的datetime.utcnow()datetime.now()代替。对于我的简单应用程序,工作正常。

相关问题