Jeg har dt = datetime(2013,9,1,11)
, og jeg ønsker å få et Unix-tidsstempel for dette datetime-objektet.
Når jeg gjør (dt - datetime(1970,1,1)).total_seconds()
fikk jeg tidsstempelet 1378033200
.
Når jeg konverterer det tilbake ved hjelp av datetime.fromtimestamp
fikk jeg datetime.datetime(2013, 9, 1, 6, 0)
.
Klokkeslettet stemmer ikke. Hva har jeg gått glipp av her?
Det du gikk glipp av her er tidssoner.
Sannsynligvis har du fem timer av UTC, så 2013-09-01T11:00:00 lokal og 2013-09-01T06:00:00Z er samme tid.
Du må lese toppen av datetime
dokumentene, som forklarer om tidssoner og "naive" og "aware" objekter.
Hvis din opprinnelige naive datetime var UTC, kan du gjenopprette den ved å bruke utcfromtimestamp
i stedet for fromtimestamp
.
På den annen side, hvis din opprinnelige naive datetime var lokal, burde du ikke ha trukket et UTC-tidsstempel fra den i utgangspunktet; bruk datetime.fromtimestamp(0)
i stedet.
Eller, hvis du hadde et bevisst datetime-objekt, må du enten bruke en lokal (bevisst) epoke på begge sider, eller eksplisitt konvertere til og fra UTC.
Hvis du har, eller kan oppgradere til, Python 3.3 eller nyere, kan du unngå alle disse problemene ved å bare bruke metoden timestamp
i stedet for å prøve å finne ut hvordan du gjør det selv. Og selv om du ikke gjør det, kan det være lurt å vurdere å låne kildekoden.
(Og hvis du kan vente på Python 3.4, det ser ut som PEP 341 er sannsynlig å gjøre det i den endelige utgivelsen, noe som betyr at alle de tingene J.F. Sebastian og jeg snakket om i kommentarene bør være gjennomførbart med bare stdlib, og arbeider på samme måte på både Unix og Windows).
I stedet for dette uttrykket for å opprette et POSIX-tidsstempel fra dt
,
(dt - datetime(1970,1,1)).total_seconds()
Bruk dette:
int(dt.strftime("%s"))
Jeg får riktig svar i eksempelet ditt ved å bruke den andre metoden.
EDIT: Litt oppfølging ... Etter noen kommentarer (se nedenfor) var jeg nysgjerrig på mangelen på støtte eller dokumentasjon for %s
i strftime
. Her er hva jeg fant:
I Python-kilden for datetime
og time
, forteller strengen STRFTIME_FORMAT_CODES
oss:
"Other codes may be available on your platform.
See documentation for the C library strftime function."
Så hvis vi nå man strftime
(på BSD-systemer som Mac OS X), vil du finne støtte for %s
:
"%s is replaced by the number of seconds since the Epoch, UTC (see mktime(3))."
Uansett, det er derfor %s
fungerer på de systemene det gjør. Men det finnes bedre løsninger på OPs problem (som tar hensyn til tidssoner). Se @abarnert&# 39s aksepterte svar her.
Vel, når du konverterer til unix-tidsstempel, antar python i utgangspunktet UTC, men mens du konverterer tilbake, vil det gi deg en dato konvertert til din lokale tidssone.
Se dette spørsmålet/svaret; https://stackoverflow.com/questions/18812638/get-timezone-used-by-datetime-datetime-fromtimestamp