2012-09-25 17 views
5

Sto prelevando una data di scadenza del cookie da Google Chrome. Da quello che sembra, Chrome sta memorizzando le scadenze dei cookie con un timestamp che usa il 1601-01-01 00:00:00 UTC come un'epoca. La mia attuale implementazione è la seguente:Converti timestamp in microsecond to datetime in Python

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

Tuttavia, questo sta producendo la data sbagliata (spento di circa un anno). Cosa sto facendo di sbagliato qui?

+2

può fornisci un timestamp di epoca e il corrispondente datetime atteso? – moooeeeep

+0

Inoltre, '10000000.0' è per un microsecondo, giusto? –

+0

13022344559000000 - 30 AGOSTO 2013 06:55 AM –

risposta

7

Un'altra opzione, ottenendo tzinfo dalla libreria standard dal Python 3.2 (per le versioni Python più vecchie si può ottenere se da 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' 

Suppongo che il la differenza rispetto al valore atteso è l'offset dei fusi orari.

Aggiornamento:

Come @JFSebastian sottolinea correttamente, se si utilizza UTC implicita ingenuidatetime oggetti, tzinfo è ridondante e quanto sopra può essere semplificata:

>>> 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

L'anno corretto è il 2013. Perché l'anno è scaduto? –

+1

Perché l'ha basato sul 1600 anziché sul 1601. – wberry

+0

Hai ragione. Corretto l'esempio per avere la giusta epoca basata su 1601. –

1

Non sono sicuro di quali dati si sta iniziando, ma qui è un esempio a partire da un timestamp intero. Suppone che sia presente il modulo pytz (che consiglio vivamente).

>>> 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' 

Quindi ce l'hai. La conversione tra un'epoca del 1 ° gennaio 1601 e un'epoca del 1 ° gennaio 1970 è di 134774 giorni.

Perché quel numero di giorni? Anni bisestili! Abbiamo aggiunto un certo numero di giorni, non anni. (. Infatti, adding years is not directly supported in timedelta oggetti)

+0

Funziona, ma penso che la soluzione di Pedro Romano, solo calcolando con l'epoca 1600-01-01 invece di calcolare staticamente l'offset di 134774 giorni e calcolarlo, è meglio (a meno che non sia in qualche modo un problema di prestazioni per uno script che necessita essere eseguito milioni di volte o qualcosa ...). – abarnert

+0

Dovrebbero essere circa le stesse prestazioni. A modo suo, calcoli la data del 1601 contro l'epoca del 1970, quindi aggiungi l'offset del tempo. In questo modo, tratti l'offset del tempo rispetto al 1970, quindi sottrai la differenza tra le epoche. – wberry