Hoe converteer je in Python seconden sinds epoch naar een `datetime` object?

De timemodule kan worden geïnitialiseerd met seconden sinds epoch:

>>> import time
>>> t1=time.gmtime(1284286794)
>>> t1
time.struct_time(tm_year=2010, tm_mon=9, tm_mday=12, tm_hour=10, tm_min=19, 
                 tm_sec=54, tm_wday=6, tm_yday=255, tm_isdst=0)

Is er een elegante manier om een datetime.datetime-object op dezelfde manier te initialiseren?


Antwoord 1, autoriteit 100%

datetime.datetime.fromtimestampzal doen, als je de tijdzone kent, zou je dezelfde output kunnen produceren als met time.gmtime

>>> datetime.datetime.fromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 11, 19, 54)

of

>>> datetime.datetime.utcfromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 10, 19, 54)

Antwoord 2, autoriteit 10%

Seconden sinds tijdperk tot datetimetot strftime:

>>> ts_epoch = 1362301382
>>> ts = datetime.datetime.fromtimestamp(ts_epoch).strftime('%Y-%m-%d %H:%M:%S')
>>> ts
'2013-03-03 01:03:02'

Antwoord 3, autoriteit 7%

Uit de documenten is de aanbevolen manier om een timezone-bewust datetime-object te krijgen van seconden sinds epoch:

Python 3:

from datetime import datetime, timezone
datetime.fromtimestamp(timestamp, timezone.utc)

Python 2, met behulp van pytz:

from datetime import datetime
import pytz
datetime.fromtimestamp(timestamp, pytz.utc)

Antwoord 4, autoriteit 2%

Houd er rekening mee dat datetime.datetime.fromtimestamp( timestamp) en .utcfromtimestamp(timestamp) mislukken in Windows voor datums vóór 1 januari 1970, terwijl negatieve Unix-tijdstempels lijken te werken op Unix-gebaseerde platforms. De documenten zeggen dit:

Dit kan ValueError veroorzaken, als de tijdstempel niet het bereik van
waarden ondersteund door de platform C gmtime() functie. Het is gebruikelijk voor
dit wordt beperkt tot de jaren 1970 tot en met 2038

Zie ook Issue1646728


Antwoord 5

Voor degenen die willen dat het voldoet aan ISO 8601, aangezien de andere oplossingen het scheidingsteken Tnoch de tijdverschuiving hebben (behalve het antwoord van Meistro):

from datetime import datetime, timezone
result = datetime.fromtimestamp(1463288494, timezone.utc).isoformat('T', 'microseconds')
print(result) # 2016-05-15T05:01:34.000000+00:00

Opmerking, ik gebruik fromtimestampwant als ik utcfromtimestampzou gebruiken, zou ik hoe dan ook op .astimezone(...)moeten ketenen om de offset.

Als je niet helemaal naar microsecondswilt gaan, kun je een andere eenheid kiezen met de
isoformat()-methode.

Other episodes