2015-02-18 115 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()代替。對於我的簡單應用程序,工作正常。

相關問題