Ich habe eine Zeit in UTC, ab der ich die Anzahl der Sekunden seit der Epoche angeben möchte.
Ich verwende strftime, um es in die Anzahl der Sekunden umzuwandeln. Am Beispiel des 1. April 2012.
>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
1. April 2012 UTC aus der Epoche ist 1333238400, aber dies oben gibt 1333234800 zurück, was sich um 1 Stunde unterscheidet.
Es sieht also so aus, als würde die Strftime meine Systemzeit berücksichtigen und irgendwo eine Zeitzonenverschiebung anwenden. Ich dachte, datetime sei rein naiv?
Wie kann ich das umgehen? Vermeiden Sie nach Möglichkeit den Import anderer Bibliotheken, sofern dies nicht Standard ist. (Ich habe Bedenken hinsichtlich der Portabilität).
datetime.datetime.timestamp(datetime.datetime.utcnow())
Antworten:
Wenn Sie eine Python-Datumszeit in Sekunden seit der Epoche konvertieren möchten, können Sie dies explizit tun:
In Python 3.3+ können Sie
timestamp()
stattdessen Folgendes verwenden :Warum sollten Sie nicht verwenden
datetime.strftime('%s')
Python unterstützt% s nicht als Argument für strftime (wenn Sie unter http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior nachsehen, ist es nicht in der Liste enthalten), das einzige Der Grund dafür ist, dass Python die Informationen an die Strftime Ihres Systems weiterleitet, die Ihre lokale Zeitzone verwendet.
quelle
.strftime("%s")
: es wird nicht unterstützt, es ist nicht portierbar, es kann stillschweigend ein falsches Ergebnis für ein bewusstes Datum / Uhrzeit-Objekt erzeugen, es schlägt fehl, wenn die Eingabe in UTC erfolgt (wie in der Frage), aber die lokale Zeitzone nicht UTC istAttributeError: 'datetime.timedelta' object has no attribute 'total_seconds'
td.seconds + td.days*24*3600
. Dadurch wird der Mikrosekunden-Teil verworfen.Ich hatte ernsthafte Probleme mit Timezones und so. Die Art und Weise, wie Python mit all dem umgeht, ist (für mich) ziemlich verwirrend. Mit dem Kalendermodul scheinen die Dinge gut zu funktionieren (siehe Links 1 , 2 , 3) und 4 ).
quelle
aprilFirst
in diesem Beispiel eine "bewusste" Instanz wäre und eine andere Zeitzone als die Zeitzone des Systems verwendet würde, wäre das Ergebnis nicht korrekt (die Zeitzone geht beimtimetuple()
Aufruf verloren). Um die richtige Antwort für eine "bewusste" Datumszeit zu erhalten, können Sie dasawaredt.timestamp()
aktuelle Python 3 verwenden. Für Python 2 ist es schwieriger. Eine Möglichkeit besteht darin, diearrow
Bibliothek zu verwenden.arrow.get(awaredt).timestamp
werde es richtig machen.datetime
Objekt nicht. Daher nahm ich an, dass "Ich habe eine Zeit in UTC" bedeutet, dass das OP ein ahnungslosesdatetime
Objekt hatte, von dem angenommen wurde , dass es in UTC ist, für das er wollte zu bekommenepoch
(wenn dasdatetime
zufällig TZ-bewusst ist, könnte dies tatsächlich Dinge ändern). Denken Sie auch daran, dass diese Antwort fast 8 Jahre alt ist und seitdem viel passiert ist (arrow
wurde zum Beispiel 2013 veröffentlicht)quelle
time.time()
(mktime()
kann während der Sommerzeitübergänge fehlschlagen, währendtime.time()
die Arbeit fortgesetzt wird). Die Frage wird nur beantwortet, wenn die lokale Zeitzone UTC ist (die Eingabe in der Frage erfolgt in UTC). Selbst wenn die Eingabe eine Ortszeit darstellen würde,mktime()
kann dies auch für vergangene / zukünftige Daten fehlschlagen, wenn die tz-Datenbank nicht verwendet wird und wenn die lokale Zeitzone im Laufe der Jahre unterschiedliche UTC-Offsets aufweist, z. B. Europa / Moskau in den Jahren 2010-2015 - - Verwenden Sie stattdessen UTC-Zeit (wie in der Frage) oder zeitzonenbezogene Datums- / Uhrzeitobjekte..now()
) in einen Epochenzeitstempel (zurückgegeben vonmktime()
) . Wenn du es liest; Sie verstehen, warum UTC-Eingabe (in der Frage verwendet) (viel) vorzuziehen ist als ein naives Datum / Uhrzeit-Objekt, das die Ortszeit darstellt(Entschuldigung, ich würde die vorhandene Antwort nicht kommentieren können.)
quelle
Wenn Sie nur einen Zeitstempel in Unix- / Epochenzeit benötigen, funktioniert diese eine Zeile:
und hängt nur von
datetime
Arbeiten in Python2 und Python3 abquelle
Dies funktioniert in Python 2 und 3:
Folgen Sie einfach den offiziellen Dokumenten ... https://docs.python.org/2/library/time.html#module-time
quelle
Verwenden Sie für eine explizite zeitzonenunabhängige Lösung die Pytz-Bibliothek.
Ausgabe (float): 1333238400.0
quelle
In Python 3.7
https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat
quelle