2016-03-23 19 views
5

provo:Timestamp fuori portata per localtime piattaforma()/gmtime function()

ts = -216345600000 
datetime.datetime.fromtimestamp(ts/1000) 

ValueError: timestamp fuori portata per localtime piattaforma() gmtime la funzione /()

I controllare il valore epochconverter: -216345600 il suo ritorno GMT: sab, 23 feb 1963 00:00:00 GMT

Come ottenere il risultato corretto?

+0

che cosa vuoi per arrivare ... a me il codice non dà errore – Stefano

+0

correlati: [ottenere il più alto gmtime possibile per qualsiasi architettura] (http://stackoverflow.com/q/32045725/4279) – jfs

risposta

5

Per molti valori, come troppo lontano nel passato o nel futuro, è sufficiente inviare il timestamp a fromtimestamp() per lamentarsi di un errore fuori intervallo. Tuttavia, è possibile calcolare la data utilizzando timedelta() relativo all'epoca.

>>> from datetime import datetime, timedelta 
>>> date = datetime(1970, 1, 1) + timedelta(seconds=-216345600) 
>>> date 
datetime.datetime(1963, 2, 23, 0, 0) 
>>> date.strftime('%a, %d %b %Y %H:%M:%S GMT') 
'Sat, 23 Feb 1963 00:00:00 GMT' 

Tuttavia, notare che non è possibile utilizzare questo per tornare all'era dei dinosauri, in quanto datetime() ha ancora un minimo e un valore massimo può supportare.

>>> datetime(1970, 1, 1) + timedelta(seconds=-62135596800) 
datetime.datetime(1, 1, 1, 0, 0) 
>>> datetime(1970, 1, 1) + timedelta(seconds=253402300799) 
datetime.datetime(9999, 12, 31, 23, 59, 59) 
>>> datetime(1970, 1, 1) + timedelta(seconds=253402300800) 

Traceback (most recent call last): 
    File "<pyshell#157>", line 1, in <module> 
    datetime(1970, 1, 1) + timedelta(seconds=253402300800) 
OverflowError: date value out of range 

timedelta() ha i suoi limiti pure, ma con l'epoca come punto di riferimento, non abbiamo venire anche vicino raggiungerli.

>>> timedelta(microseconds=1000000000*86400*10000-1) 
datetime.timedelta(9999999, 86399, 999999)