wake-up-neo.com

Konvertieren Sie Python-Datetime in Epoch mit strftime

Ich habe eine Zeit in UTC, von der ich die Anzahl der Sekunden seit Epoche möchte.

Ich verwende strftime, um es in Sekunden umzuwandeln. Am 1. April 2012 als Beispiel.

>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'

1. April 2012 UTC von Epoch ist 1333238400, aber das oben genannte gibt 1333234800 zurück, was um 1 Stunde anders ist. 

Es sieht also so aus, als würde Striftzeit meine Systemzeit berücksichtigen und irgendwo eine Zeitzonenverschiebung vornehmen. Ich dachte, datetime sei rein naiv?

Wie kann ich das umgehen? Vermeiden Sie nach Möglichkeit den Import anderer Bibliotheken, sofern nicht standardmäßig. (Ich habe Bedenken hinsichtlich der Portabilität).

144
Noel

Wenn Sie eine Python-Datumszeit in Sekunden seit Epoch konvertieren möchten, können Sie dies explizit tun:

>>> (datetime.datetime(2012,04,01,0,0) - datetime.datetime(1970,1,1)).total_seconds()
1333238400.0

In Python 3.3+ können Sie stattdessen timestamp() verwenden:

>>> datetime.datetime(2012,4,1,0,0).timestamp()
1333234800.0

Warum sollten Sie datetime.strftime('%s') nicht verwenden?

Python unterstützt% s nicht wirklich als Argument für strftime (wenn Sie unter http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior nachsehen, ist dies nicht in der Liste ), der einzige Grund, warum es funktioniert, ist, dass Python die Informationen an die Strftime Ihres Systems weitergibt, die Ihre lokale Zeitzone verwendet.

>>> datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
284
jleahy

Ich hatte ernsthafte Probleme mit Timezones und so. Die Art und Weise, wie Python damit umgeht, ist für mich ziemlich verwirrend. Mit dem Kalendermodul scheint es gut zu laufen (siehe Links 1 , 2 , 3 und 4 ).

>>> import datetime
>>> import calendar
>>> aprilFirst=datetime.datetime(2012, 04, 01, 0, 0)
>>> calendar.timegm(aprilFirst.timetuple())
1333238400
86
BorrajaX
import time
from datetime import datetime
now = datetime.now()

time.mktime(now.timetuple())
31
srossross
import time
from datetime import datetime
now = datetime.now()

# same as above except keeps microseconds
time.mktime(now.timetuple()) + now.microsecond * 1e-6

(Sorry, ich würde mich nicht zu der vorhandenen Antwort äußern)

14
Charles Plager

Dies funktioniert in Python 2 und 3:

>>> import time
>>> import calendar
>>> calendar.timegm(time.gmtime())
1504917998

Folgen Sie einfach den offiziellen Dokumenten ... https://docs.python.org/2/library/time.html#module-time

2
Luis Pollo

wenn Sie nur einen Zeitstempel in Unix/Epoch-Zeit benötigen, funktioniert diese eine Zeile:

created_timestamp = int((datetime.datetime.now() - datetime.datetime(1970,1,1)).total_seconds())
>>> created_timestamp
1522942073L

und hängt nur von datetimeworks in python2 und python3 ab

2
Marc Maxmeister

In Python 3.7

Gibt eine datetime zurück, die einem date_string in einem der Formate entspricht Wird von date.isoformat () und datetime.isoformat () ausgegeben. Speziell, Diese Funktion unterstützt Zeichenfolgen in den Formaten JJJJ-MM-TT [* HH [: MM [: SS [.fff [fff]]]] [+ HH: MM [: SS [.ffffff]]]], wobei * kann mit jedem einzelnen Zeichen übereinstimmen.

https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat

0
SuperNova

Verwenden Sie für eine explizite zeitzonenunabhängige Lösung die pytz-Bibliothek.

import datetime
import pytz

pytz.utc.localize(datetime.datetime(2012,4,1,0,0), is_dst=False).timestamp()

Ausgabe (float): 1333238400.0

0
Moobie