2012-09-25 134 views
5

我從Google Chrome中提取cookie過期日期。從它看起來,Chrome存儲cookie過期時間戳,使用UTC時間1601-01-01 00:00:00作爲時代。我目前的實施如下:將微秒時間戳轉換爲Python中的日期時間

stamp = int(result[3]) 
date = datetime.datetime.fromtimestamp(stamp/10000000.0) 
print date.year 

但是,這是產生錯誤的日​​期(關閉大約一年)。我在這裏做錯了什麼?

+2

可以你舉了一個例子時代的時間戳和相應的預期日期時間? – moooeeeep

+0

另外,'10000000.0'是微秒的權利? –

+0

13022344559000000 - 2013年8月30日06:55 –

回答

7

另一種選擇,讓tzinfo標準庫中因爲Python 3.2(較舊版本的Python,你可以得到,如果從pytz):

>>> import pytz 
>>> from datetime import datetime, timedelta, timezone 
>>> epoch = datetime(1601, 1, 1, tzinfo=timezone.utc) 
>>> cookie_microseconds_since_epoch = 13022344559000000 
>>> cookie_datetime = epoch + timedelta(microseconds=cookie_microseconds_since_epoch) 
>>> str(cookie_datetime) 
'2013-08-29 13:55:59+00:00' 

我假設與您的期望值不同的是時區偏移量。

更新:

作爲@JFSebastian正確地指出,如果使用的是隱式UTC 幼稚datetime目的,tzinfo是多餘的,上述可以被簡化爲:

>>> from datetime import datetime, timedelta 
>>> epoch = datetime(1601, 1, 1) 
>>> cookie_microseconds_since_epoch = 13022344559000000 
>>> cookie_datetime = epoch + timedelta(microseconds=cookie_microseconds_since_epoch) 
>>> str(cookie_datetime) 
'2013-08-30 13:55:59' 
+0

適當的一年是2013年。爲什麼是一年呢? –

+1

因爲他基於1600而不是1601. – wberry

+0

你是對的。修正了以1601爲基礎的新紀元的例子。 –

1

我不確定你開始的數據是什麼,但這裏是一個從整數時間戳開始的例子。假定pytz模塊存在(我高度推薦)。

>>> import datetime, pytz 
>>> x = datetime.datetime.fromtimestamp(0) 
>>> x = x.replace(tzinfo=pytz.UTC) 
>>> str(x) 
'1970-01-01 00:00:00+00:00' 
>>> d = datetime.timedelta(365 * (1970 - 1601)) 
>>> str(x - d) 
'1601-03-31 00:00:00+00:00' 
>>> d = datetime.timedelta(365 * (1970 - 1601) + 31 + 28 + 31 - 1) 
>>> str(x - d) 
'1601-01-01 00:00:00+00:00' 
>>> str(d) 
'134774 days, 0:00:00' 

所以你有它。 1601年1月1日至1970年1月1日之間的轉換是134774天。

爲什麼這麼多天?閏年!我們增加了一定的天數,而不是幾年。 (事實上​​,在adding years is not directly supportedtimedelta對象)

+0

這是有效的,但我認爲佩德羅羅馬諾的解決方案,只是計算1600-01-01時代,而不是靜態地計算出134774天的偏移量,並用它來計算,效果會更好(除非它是某種需要腳本的性能問題運行數百萬次或其他...)。 – abarnert

+0

應該與性能相同。他的方式是,計算1970年的時間與1970年的時間,然後添加時間偏移量。這樣,您將時間偏移量視爲1970年,然後減去時期之間的差異。 – wberry

相關問題