Warum enthält Python 2.7 im Gegensatz zu JavaScript kein Z-Zeichen (Zulu oder Nullpunktverschiebung) am Ende der Isoformat-Zeichenfolge des UTC-Datetime-Objekts?
>>> datetime.datetime.utcnow().isoformat()
'2013-10-29T09:14:03.895210'
Während in Javascript
>>> console.log(new Date().toISOString());
2013-10-29T09:38:41.341Z
datetime.datetime.utcnow().isoformat() + 'Z'
Antworten:
Python-
datetime
Objekte haben standardmäßig keine Zeitzoneninformationen. Ohne diese Informationen verstößt Python tatsächlich gegen die ISO 8601-Spezifikation ( wenn keine Zeitzoneninformationen angegeben werden, wird davon ausgegangen, dass es sich um Ortszeit handelt ). Sie können das Pytz-Paket verwenden , um einige Standardzeitzonen abzurufen , oder sich direkt in eine Unterklasse einteilentzinfo
:Anschließend können Sie die Zeitzoneninformationen manuell hinzufügen zu
utcnow()
:Beachten Sie, dass dies dem ISO 8601-Format entspricht, das entweder
Z
oder+00:00
als Suffix für UTC zulässt . Beachten Sie, dass letzteres tatsächlich besser dem Standard entspricht, wie Zeitzonen im Allgemeinen dargestellt werden (UTC ist ein Sonderfall.)quelle
Z
statt ein+00:00
?pytz
verstößt gegen Pythonstzinfo
Protokoll und ist gefährlich zu bedienen! Siehe blog.ganssle.io/articles/2018/03/pytz-fastest-footgun.htmldateutil
, erst in Python 3.6 mit PEP 495pytz
implementiert wurden. Es ist also unfair, die Standardschnittstelle nicht zu verwenden, da sich die Schnittstelle geändert hat. Vor der Änderung war die einzige Möglichkeit, es zum Laufen zu bringen, die Art und Weise,pytz
wie es funktioniert hat.Möglichkeit:
isoformat()
Pythons unterstützt
datetime
keine militärischen Zeitzonensuffixe wie das Z-Suffix für UTC. Der folgende einfache String-Ersatz reicht aus:str(d)
ist im Wesentlichen das gleiche wied.isoformat(sep=' ')
Siehe: Datetime, Python Standard Library
Möglichkeit:
strftime()
Oder Sie könnten
strftime
den gleichen Effekt erzielen:Hinweis: Diese Option funktioniert nur, wenn Sie wissen, dass das angegebene Datum in UTC angegeben ist.
Siehe: datetime.strftime ()
Zusätzlich: Vom Menschen lesbare Zeitzone
Wenn Sie weiter gehen, könnten Sie daran interessiert sein, von Menschen lesbare Zeitzoneninformationen
pytz
mitstrftime
%Z
Zeitzonenflag anzuzeigen :quelle
T
anstelle eines Leerzeichens sein?d = datetime.datetime(2014, 12, 10, 12, 0, 0, tzinfo=datetime.timezone.utc)
in Zeile 2 stehen. Übrigens heißt es in RFC3339 , dass ein Leerzeichen 'ok' ist (anstelle des 'T').Die folgenden Javascript- und Python-Skripte liefern identische Ausgaben. Ich denke, es ist das, wonach Sie suchen.
JavaScript
Python
Die Ausgabe, die sie geben, ist die utc (zelda) -Zeit, die als ISO-Zeichenfolge mit einer 3-Millisekunden-signifikanten Ziffer formatiert und mit einem Z versehen ist.
quelle
In Python> = 3.2 können Sie einfach Folgendes verwenden:
quelle
Z
können Sie den Offset.isoformat()[:-6] + 'Z'
Python-Daten sind etwas klobig. Verwenden Sie
arrow
.Arrow hat im Wesentlichen die gleiche API wie datetime, jedoch mit Zeitzonen und einigen zusätzlichen Feinheiten, die in der Hauptbibliothek enthalten sein sollten.
Ein mit Javascript kompatibles Format kann erreicht werden durch:
Javascript löscht
Date.parse
leise Mikrosekunden vom Zeitstempel.quelle
Es gibt viele gute Antworten auf den Beitrag, aber ich wollte, dass das Format genau so herauskommt wie bei JavaScript. Dies ist, was ich benutze und es funktioniert gut.
quelle
quelle
Ich habe dieses Problem mit ein paar Zielen angegangen:
timezone
Dienstprogrammfunktion und derdateutil
ParserDieser Ansatz enthält kein Z-Suffix und wird nicht verwendet
utcnow()
. Er basiert jedoch auf der Empfehlung in der Python-Dokumentation und besteht die Musterung mit Django und JavaScript.Beginnen wir damit, ein UTC-Zeitzonenobjekt zu übergeben,
datetime.now()
anstatt Folgendes zu verwendendatetime.utcnow()
:Das sieht gut aus, also mal sehen was Django und
dateutil
denken:Okay, das Python-Datum / Uhrzeit-Objekt und die ISO 8601-Zeichenfolge sind UTC-fähig. Schauen wir uns nun an, was JavaScript von der datetime-Zeichenfolge hält. Aus dieser Antwort entlehnt erhalten wir:
Vielleicht möchten Sie auch diesen Blog-Beitrag lesen .
quelle
Durch die Kombination aller obigen Antworten kam ich mit folgender Funktion:
quelle
Ich benutze Pendel:
quelle
Oder um es auf einen Schlag zu bekommen:
quelle