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()
此調用返回一個不正確的日期時間,從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