662 Stimmen

ISO-Zeit (ISO 8601) in Python

Ich habe eine Datei. In Python möchte ich ihre Erstellungszeit nehmen und sie in eine ISO-Zeit (ISO 8601) Zeichenfolge unter Beibehaltung der Tatsache, dass sie in der Östliche Zeitzone (ET) .

Wie kann ich die ctime der Datei in einen ISO-Zeitstring umwandeln, der die östliche Zeitzone angibt (und gegebenenfalls die Sommerzeit berücksichtigt)?

1143voto

estani Punkte 20703

Lokal nach ISO 8601:

import datetime
datetime.datetime.now().isoformat()
>>> 2020-03-20T14:28:23.382748

UTC nach ISO 8601:

import datetime
datetime.datetime.utcnow().isoformat()
>>> 2020-03-20T01:30:08.180856

Lokal nach ISO 8601 ohne Mikrosekunde:

import datetime
datetime.datetime.now().replace(microsecond=0).isoformat()
>>> 2020-03-20T14:30:43

UTC zu ISO 8601 mit Zeitzoneninformation (Python 3):

import datetime
datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc).isoformat()
>>> 2020-03-20T01:31:12.467113+00:00

UTC zu ISO 8601 mit lokaler Zeitzoneninformation ohne Mikrosekunde (Python 3):

import datetime
datetime.datetime.now().astimezone().replace(microsecond=0).isoformat()
>>> 2020-03-20T14:31:43+13:00

Lokal nach ISO 8601 mit TimeZone-Informationen (Python 3):

import datetime
datetime.datetime.now().astimezone().isoformat()
>>> 2020-03-20T14:32:16.458361+13:00

Beachten Sie, dass es einen Fehler bei der Verwendung von astimezone() zur UTC-Zeit. Dies ergibt ein falsches Ergebnis:

datetime.datetime.utcnow().astimezone().isoformat() #Incorrect result

Für Python 2, siehe und verwende pytz .

121voto

Jim Hunziker Punkte 12726

ISO 8601 erlaubt eine kompakte Darstellung ohne Trennzeichen mit Ausnahme des T Daher verwende ich gerne diesen Einzeiler, um eine schnelle Zeitstempel-Zeichenkette zu erhalten:

>>> datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%S.%fZ")
'20180905T140903.591680Z'

Wenn Sie die Mikrosekunden nicht brauchen, lassen Sie einfach die .%f Teil:

>>> datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%SZ")
'20180905T140903Z'

Für die Ortszeit:

>>> datetime.datetime.now().strftime("%Y%m%dT%H%M%S")
'20180905T140903'

Im Allgemeinen empfehle ich, die Interpunktion zu lassen. RFC 3339 empfiehlt diesen Stil, denn wenn jeder die Zeichensetzung verwendet, besteht nicht die Gefahr, dass z. B. mehrere ISO 8601-Zeichenfolgen nach ihrer Zeichensetzung in Gruppen sortiert werden. Der Einzeiler für eine konforme Zeichenfolge wäre also:

>>> datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ")
'2018-09-05T14:09:03Z'

81voto

radtek Punkte 30114

Ich verwende das folgende Verfahren zur Konvertierung in das XSD-Datetime-Format:

from datetime import datetime
datetime.now().replace(microsecond=0).isoformat()
# You get your ISO string

Ich bin auf diese Frage gestoßen, als ich nach dem XSD-Datum-Zeitformat ( xs:dateTime ). Ich musste die Mikrosekunden aus isoformat .

66voto

Voislav Sauca Punkte 2784

ISO 8601 Zeitdarstellung

Die internationale Norm ISO 8601 beschreibt eine String-Darstellung für Datums- und Zeitangaben. Zwei einfache Beispiele für dieses Format sind

2010-12-16 17:22:15
20101216T172215

(die beide für den 16. Dezember 2010 stehen), aber das Format erlaubt auch Zeiten mit einer Auflösung von weniger als einer Sekunde und die Angabe von Zeitzonen. Dieses Format ist natürlich nicht Python-spezifisch, aber es ist gut geeignet, um Daten und Zeiten in einem portablen Format zu speichern. Einzelheiten zu diesem Format finden Sie in der Eintrag Markus Kuhn .

Ich empfehle die Verwendung dieses Formats, um Zeiten in Dateien zu speichern.

Eine Möglichkeit, die aktuelle Zeit in dieser Darstellung zu erhalten, ist die Verwendung von strftime aus dem Zeitmodul der Python-Standardbibliothek:

>>> from time import strftime
>>> strftime("%Y-%m-%d %H:%M:%S")
'2010-03-03 21:16:45'

Sie können den Konstruktor strptime der Klasse datetime verwenden:

>>> from datetime import datetime
>>> datetime.strptime("2010-06-04 21:08:12", "%Y-%m-%d %H:%M:%S")
datetime.datetime(2010, 6, 4, 21, 8, 12)

Am robustesten ist das Egenix mxDateTime-Modul:

>>> from mx.DateTime.ISO import ParseDateTimeUTC
>>> from datetime import datetime
>>> x = ParseDateTimeUTC("2010-06-04 21:08:12")
>>> datetime.fromtimestamp(x)
datetime.datetime(2010, 3, 6, 21, 8, 12)

Referenzen

53voto

user2120810 Punkte 517

Ich fand das datetime.isoformat in die Dokumentation . Es scheint zu tun, was Sie wollen:

datetime.isoformat([sep])

Return a string representing the date and time in ISO 8601 format, YYYY-MM-DDTHH:MM:SS.mmmmmm or, if microsecond is 0, YYYY-MM-DDTHH:MM:SS

If utcoffset() does not return None, a 6-character string is appended, giving the UTC offset in (signed) hours and minutes: YYYY-MM-DDTHH:MM:SS.mmmmmm+HH:MM or, if microsecond is 0 YYYY-MM-DDTHH:MM:SS+HH:MM

The optional argument sep (default 'T') is a one-character separator, placed between the date and time portions of the result. For example,
>>>

>>> from datetime import tzinfo, timedelta, datetime
>>> class TZ(tzinfo):
...     def utcoffset(self, dt): return timedelta(minutes=-399)
...
>>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')
'2002-12-25 00:00:00-06:39'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X