Python datetime.utcnow() returning incorrect datetime
1 | datetime.utcnow() |
此调用返回的日期时间不正确,从UTC/GMT延迟了1小时(签入:http://www.worldtimeserver.com/current_time_in_utc.asp)。
它能正常工作吗?
例如,它现在正在返回:
1 | 2015-02-17 23:58:44.761000. |
当前的UTC时间是:00:58,而不是23:58
您可以按如下方式检查自我一致性:
1 2 3 4 5 6 7 | #!/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上调用
1 2 3 4 5 6 7 8 9 10 11 | #!/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())) |
下面是在python2上调用
我知道我回答这件事已经非常晚了。
我最近尝试过这样做,因此我建议使用
问题只在UTC时间(python3)发生。
例如,系统时间:
1 2 3 | $ date Wed Jul 15 10:44:26 BST 2015 |
使用datetime.now()时python时间正确:
1 2 3 | >>> datetime.now() datetime.datetime(2015, 7, 15, 10, 44, 30, 775840) |
…但在使用datetime.utcnow()时一小时内不正确:
1 2 3 | >>> datetime.utcnow() datetime.datetime(2015, 7, 15, 9, 44, 32, 599823) |
UTC的问题是它不知道我的时区。
你必须在一个叫做pytz的时区模块的帮助下告诉它:
1 2 3 4 5 | >>> 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-defects-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)