it-swarm.com.de

Python UTC datetime-Objekt im ISO-Format enthält kein Z (Zulu- oder Nullpunktverschiebung)

Warum enthält python 2.7 im Gegensatz zu JavaScript kein Z-Zeichen (Zulu oder Nullpunktverschiebung) am Ende des Isoformat-Strings des UTC-Datums-/Uhrzeitobjekts?

>>> 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
75
Murali Mopuru

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 sind) (wird als Ortszeit angenommen ). Sie können das pytz-Paket verwenden, um einige Standardzeitzonen abzurufen, oder tzinfo direkt unterklassifizieren:

from datetime import datetime, tzinfo, timedelta
class simple_utc(tzinfo):
    def tzname(self,**kwargs):
        return "UTC"
    def utcoffset(self, dt):
        return timedelta(0)

Dann können Sie die Zeitzoneninformationen manuell zu utcnow() hinzufügen:

>>> datetime.utcnow().replace(tzinfo=simple_utc()).isoformat()
'2014-05-16T22:51:53.015001+00:00'

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 letztere dem Standard tatsächlich besser entspricht und die Zeitzonen im Allgemeinen dargestellt werden (UTC ist ein Sonderfall).

38
stiv

Option: isoformat()

Pythons datetime unterstützt nicht die militärische Zeitzone Suffixe wie das 'Z'-Suffix für UTC. Der folgende einfache String-Austausch erledigt den Trick:

In [1]: import datetime

In [2]: d = datetime.datetime(2014, 12, 10, 12, 0, 0)

In [3]: str(d).replace('+00:00', 'Z')
Out[3]: '2014-12-10 12:00:00Z'

str(d) ist im Wesentlichen dasselbe wie d.isoformat(sep=' ')

Siehe: Datetime, Python Standard Library

Option: strftime()

Oder Sie können strftime verwenden, um den gleichen Effekt zu erzielen:

In [4]: d.strftime('%Y-%m-%d %H:%M:%SZ')
Out[4]: '2014-12-10 12:00:00Z'

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, mit dem Zeitzonen-Flag strftime%Z Anzuzeigen:

In [5]: import pytz

In [6]: d = datetime.datetime(2014, 12, 10, 12, 0, 0, tzinfo=pytz.utc)

In [7]: d
Out[7]: datetime.datetime(2014, 12, 10, 12, 0, tzinfo=<UTC>)

In [8]: d.strftime('%Y-%m-%d %H:%M:%S %Z')
Out[8]: '2014-12-10 12:00:00 UTC'
33
Manav Kataria

Python-Daten sind ein wenig klobig. Verwenden Sie arrow.

> str(arrow.utcnow())
'2014-05-17T01:18:47.944126+00:00'

Arrow hat im Wesentlichen die gleiche API wie datetime, jedoch mit Zeitzonen und einigen zusätzlichen Feinheiten, die in der Hauptbibliothek vorhanden sein sollten.

Ein mit Javascript kompatibles Format kann erreicht werden durch:

arrow.utcnow().isoformat().replace("+00:00", "Z")
'2018-11-30T02:46:40.714281Z'

Javascript Date.parse löscht leise Mikrosekunden vom Zeitstempel.

6
U2EF1

Die folgenden Javascript- und python -Skripte liefern identische Ergebnisse. Ich denke, es ist das, wonach Sie suchen.

JavaScript

new Date().toISOString()

Python

import datetime

datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'

Die Ausgabe, die sie geben, ist die UTC-Zeit (Zelda), die als ISO-Zeichenfolge mit einer 3-Millisekunden-Stelle formatiert und mit einem Z versehen ist.

2019-01-19T23:20:25.459Z
4
Jam Risser

In Python> = 3.2 können Sie einfach Folgendes verwenden:

>>> from datetime import datetime, timezone
>>> datetime.now(timezone.utc).isoformat()
'2019-03-14T07:55:36.979511+00:00'
2
Michel Samia

Es gibt viele gute Antworten auf den Beitrag, aber ich wollte, dass das Format genau so aussieht, wie es mit JavaScript funktioniert. Dies ist, was ich benutze und es funktioniert gut.

In [1]: import datetime

In [1]: now = datetime.datetime.utcnow()

In [1]: now.strftime('%Y-%m-%dT%H:%M:%S') + now.strftime('.%f')[:4] + 'Z'
Out[3]: '2018-10-16T13:18:34.856Z'
1
Michael Cox

Durch Kombinieren aller Antworten oben kam ich mit folgender Funktion:

from datetime import datetime, tzinfo, timedelta
class simple_utc(tzinfo):
    def tzname(self,**kwargs):
        return "UTC"
    def utcoffset(self, dt):
        return timedelta(0)


def getdata(yy, mm, dd, h, m, s) :
    d = datetime(yy, mm, dd, h, m, s)
    d = d.replace(tzinfo=simple_utc()).isoformat()
    d = str(d).replace('+00:00', 'Z')
    return d


print getdata(2018, 02, 03, 15, 0, 14)
1
EmptyData
pip install python-dateutil
>>> a = "2019-06-27T02:14:49.443814497Z"
>>> dateutil.parser.parse(a)
datetime.datetime(2019, 6, 27, 2, 14, 49, 443814, tzinfo=tzutc())
1
W Yg