Ich persönlich denke, dass das datetime-Modul eine der Standard-Python-Bibliotheken ist, die nicht sehr cool ist, da es häufig verwendet wird, aber viele Fallen hat und schwierig zu verwenden ist.
Es ist so ein Datum / Uhrzeit-Modul, aber ich bin ein wenig beeindruckt von der Tatsache, dass ich den Code sehr gut organisieren konnte, als ich mein Python 2-Projekt auf Python 3 migrierte, daher möchte ich ihn vorstellen.
Die Konvertierung von Unixtime nach "datetime.datetime" erfolgt mit der Funktion ".fromtimestamp ()" für die Ortszeit und der Funktion ".utcfromtimestamp ()" für UTC.
>>> import time
>>> from datetime import datetime
>>> now = time.time()
>>> now
1415542873.099776
>>> loc = datetime.fromtimestamp(now)
>>> loc
datetime.datetime(2014, 11, 9, 23, 21, 13, 99776)
>>> utc = datetime.utcfromtimestamp(now)
>>> utc
datetime.datetime(2014, 11, 9, 14, 21, 13, 99776)
Im Gegenteil, die Konvertierung von "datetime" nach "unixtime" kann nicht direkt durchgeführt werden, und es ist erforderlich, sie einmal mit der Methode ".timetuple ()" in den Typ "time.struct_time" zu konvertieren. Wenn Sie von dort zu Unixtime zurückkehren, können Sie für die Ortszeit "time.mktime ()" verwenden, für UTC jedoch "calendar.timegm ()". Es ist ein wenig enttäuschend, das Kalendermodul nur dafür zu importieren.
>>> time.mktime(loc.timetuple())
1415542873.0
>>> import calendar
>>> calendar.timegm(utc.timetuple())
1415542873
Das Zeitmodul bietet nur einen zusätzlichen Timer pro Betriebssystem für die Funktionalität der C-Sprache time.h
, und datetime ist umgekehrt für Python ausgelegt. Wenn Sie also versuchen, es in Kombination zu verwenden, tritt eine solche Nichtübereinstimmung auf. War dort.
Python 3.3 fügt jedoch eine ".timestamp ()" - Methode hinzu, die Unixtime direkt auf dem datetime-Objekt erstellt.
>>> from datetime import datetime
>>> now = 1415542873.099776
>>> loc = datetime.fromtimestamp(now)
>>> loc.timestamp()
1415542873.099776
.Timestamp ()
verwendet jedoch tzinfo, das datetime selbst hat, und wenn es datetime (naiv genannt) ist, das tzinfo nicht hat, wird es als Ortszeit berechnet.
Wenn Sie UTC datetime in unixtime konvertieren möchten, müssen Sie tz = utc richtig einstellen. Siehe hierzu den nächsten Abschnitt.
timezone
Der datetime-Typ des datetime-Moduls mit Zeitzoneninformationen wird als bewusst bezeichnet, und derjenige, der keine Zeitzoneninformationen enthält, wird als naiv bezeichnet.
Die naive Datumszeit ist attraktiv als reiner Typ, der bei der Interaktion mit anderer naiver Software wie MySQL nicht von der verrauschten Zeitzonenkonvertierung abhängig wird, sondern beim Schreiben von Programmen, die sowohl UTC als auch JST verarbeiten. Wenn Sie einen Fehler machen und +9 zweimal ausführen, wird dies einen Fehler verursachen.
IANA veröffentlicht eine Datenbank mit Weltzeitzonen. Da das Timing jedoch nicht mit dem Python-Versions-Upgrade synchronisiert ist, bietet die Standardbibliothek nur abstrakte Klassen und die tatsächlichen Zeitzonenklassen, die davon erben. Wurde in einer nicht standardmäßigen Bibliothek namens pytz bereitgestellt.
JST und UTC, die bisher keine Sommerzeit haben, sind jedoch ausreichende Anwendungen, und es ist ein wenig mühsam, Zeitzonendatenbanken auf der ganzen Welt zu verwenden. Ich habe das Gefühl, dass ich die Gefühle von ASCII-sprechenden Menschen verstehen kann, die nicht an die Multi-Byte-Umgebung denken möchten.
In Python 3 wird in der Standardbibliothek eine Klasse mit dem Namen "datetime.timezone" bereitgestellt, die Zeitzonen mit einem festen Zeitunterschied zu UTC und ohne Sommerzeit verarbeitet. Für UTC wird "datetime.timezone.utc" von Anfang an bereitgestellt. Es ist vorgesehen.
Verwenden Sie dies, um die Unixtime und die Datums- / Uhrzeitangabe zu konvertieren, die wir im vorherigen Abschnitt durchgeführt haben, diesmal mit einer bewussten Datums- / Uhrzeitangabe.
>>> from datetime import datetime, timezone, timedelta
>>> now = 1415542873.099776
>>> JST = timezone(timedelta(hours=+9), 'JST')
>>> loc = datetime.fromtimestamp(now, JST)
>>> utc = datetime.fromtimestamp(now, timezone.utc)
>>> print(loc)
2014-11-09 23:21:13.099776+09:00
>>> print(utc)
2014-11-09 14:21:13.099776+00:00
>>> loc.timestamp()
1415542873.099776
>>> utc.timestamp()
1415542873.099776
Sie benötigen nicht einmal ein Kalendermodul und können jetzt einfacheren, weniger fehlerhaften Code als in Python 2 schreiben.
Verwenden Sie die Methode .replace ()
, um der naiven Datumszeit Zeitzoneninformationen hinzuzufügen.
>>> naiveutc = datetime.utcfromtimestamp(now)
>>> naiveutc
datetime.datetime(2014, 11, 9, 14, 21, 13, 99776)
>>> naiveutc.replace(tzinfo=timezone.utc).timestamp()
1415542873.099776