ISO-Zeit (ISO 8601) in Python?

Ich habe eine Akte. In Python möchte ich seine Schöpfungszeit nehmen und es in eine ISO-Zeit (ISO 8601) Saite umwandeln, während ich die Tatsache bewahrt habe, dass es in der Eastern Time Zone entstanden ist .

Wie nehme ich die ctime der Datei und konvertiere sie in eine ISO-Zeitzeichenfolge, die die Eastern Time Zone angibt (und berücksichtigt die Sommerzeit, falls nötig)?

  • Umwandlung der Zeitausgabe in eine Float-Variable (Python)
  • Ausgabe / Druck ein "lesbares" Wörterbuch
  • Konvertieren Sie python datetime in Zeitstempel in Millisekunden
  • Python - Zugriff auf Werte, die in Wörterbüchern verschachtelt sind
  • Dict und List Manipulation Python
  • Python - Wörterbuch Iterator für Pool-Karte
  • 10 Solutions collect form web for “ISO-Zeit (ISO 8601) in Python?”

    Lokal nach ISO-8601:

    import datetime datetime.datetime.now().isoformat() 

    UTC nach ISO-8601:

     import datetime datetime.datetime.utcnow().isoformat() 

    Ich fand das datetime.isoformat in der doc ; Scheint zu tun was du willst

     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' 

    ISO 8601 Zeitdarstellung

    Die internationale Norm ISO 8601 beschreibt eine Stringdarstellung für Datum und Uhrzeit. Zwei einfache Beispiele dieses Formats sind

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

    (Die beide für den 16. Dezember 2010 stehen), aber das Format erlaubt auch Zeitunterbrechungszeiten und spezifiziert Zeitzonen. Dieses Format ist natürlich nicht Python-spezifisch, aber es ist gut für die Speicherung von Datum und Uhrzeit in einem tragbaren Format. Details zu diesem Format finden Sie im Markus Kuhn Eintrag

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

    Ein Weg, um die aktuelle Zeit in dieser Darstellung zu erhalten, ist, Strertime aus dem Zeitmodul in der Python-Standardbibliothek zu verwenden:

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

    Sie können den Strptime-Konstruktor der datetime-Klasse 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) 

    Das robusteste 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

    • Die Pythonzeitmoduldokumentation

    • Die Python-Datetime-Klassendokumentation

    • Die Egenix mxDateTime Klasse

    Hier ist, was ich benutze, um in XSD datetime Format zu konvertieren:

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

    Ich habe diese Frage bei der Suche nach XSD Datum Zeitformat. Ich musste die Mikrosekunden aus dem isoformat entfernen. Prost!

    ISO8601-Zeitformat speichert keinen Zeitzonennamen, nur der entsprechende utc-Offset bleibt erhalten.

    Um eine Datei ctime in eine ISO 8601 Zeitzeichenfolge zu konvertieren, während der utc-Offset in Python 3 beibehalten wird:

     >>> import os >>> from datetime import datetime, timezone >>> ts = os.path.getctime(some_file) >>> dt = datetime.fromtimestamp(ts, timezone.utc) >>> dt.astimezone().isoformat() '2015-11-27T00:29:06.839600-05:00' 

    Der Code geht davon aus, dass Ihre lokale Zeitzone Eastern Time Zone ist und dass Ihr System einen korrekten UTC-Offset für den angegebenen POSIX-Zeitstempel ( ts ) bereitstellt, dh python hat Zugriff auf eine historische Zeitzonendatenbank auf Ihrem System oder die Zeitzone hatte die gleichen Regeln Ein gegebenes Datum.

    Wenn Sie eine tragbare Lösung benötigen, pytz Modul verwenden , das Zugriff auf die tz-Datenbank bietet:

     >>> import os >>> from datetime import datetime >>> import pytz # pip install pytz >>> ts = os.path.getctime(some_file) >>> dt = datetime.fromtimestamp(ts, pytz.timezone('America/New_York')) >>> dt.isoformat() '2015-11-27T00:29:06.839600-05:00' 

    Das Ergebnis ist in diesem Fall das gleiche.

    Wenn Sie die Zeitzonenname / Abkürzung / Zonen-ID benötigen; Separat aufbewahren

     >>> dt.astimezone().strftime('%Y-%m-%d %H:%M:%S%z (%Z)') '2015-11-27 00:29:06-0500 (EST)' 

    Hinweis: nein : in der utc-Offset- und EST Zeitzonenabkürzung ist nicht Teil des ISO8601-Zeitformats. Es ist nicht einzigartig.

    Verschiedene Bibliotheken / verschiedene Versionen derselben Bibliothek können unterschiedliche Zeitzonenregeln für das gleiche Datum / Zeitzone verwenden. Wenn es ein zukünftiges Datum ist, dann sind die Regeln noch unbekannt. Mit anderen Worten, die gleiche UTC-Zeit kann einer anderen Ortszeit entsprechen, je nachdem, welche Regeln Sie verwenden – das Speichern einer Zeit im ISO8601-Format bewahrt die UTC-Zeit und die lokale Zeit, die den aktuellen Zeitzonenregeln entspricht, die auf Ihrer Plattform verwendet werden. Möglicherweise müssen Sie die lokale Zeit auf einer anderen Plattform neu berechnen, wenn es unterschiedliche Regeln hat.

    Sie müssen os.stat , um die os.stat und eine Kombination von time.strftime und time.timezone für die Formatierung zu erhalten:

     >>> import time >>> import os >>> t = os.stat('C:/Path/To/File.txt').st_ctime >>> t = time.localtime(t) >>> formatted = time.strftime('%Y-%m-%d %H:%M:%S', t) >>> tz = str.format('{0:+06.2f}', float(time.timezone) / 3600) >>> final = formatted + tz >>> >>> final '2008-11-24 14:46:08-02.00' 

    EDIT: Umschalten von gmtime() auf localtime() .

    Korrigieren Sie mich, wenn ich falsch bin (ich bin nicht), aber der Offset von UTC ändert sich mit Sommerzeit. Also solltest du benutzen

     tz = str.format('{0:+06.2f}', float(time.altzone) / 3600) 

    Ich glaube auch, dass das Zeichen anders sein sollte

     tz = str.format('{0:+06.2f}', -float(time.altzone) / 3600) 

    Ich könnte mich irren, aber ich glaube nicht

    Ich bin mit Jarek einverstanden, und ich stelle ferner fest, dass der ISO-Offset-Trennzeichen ein Doppelpunkt ist, also denke ich, dass die endgültige Antwort sein sollte:

     isodate.datetime_isoformat(datetime.datetime.now()) + str.format('{0:+06.2f}', -float(time.timezone) / 3600).replace('.', ':') 

    Ich habe diese Funktion entwickelt:

     def iso_8601_format(dt): """YYYY-MM-DDThh:mm:ssTZD (1997-07-16T19:20:30-03:00)""" if dt is None: return "" fmt_datetime = dt.strftime('%Y-%m-%dT%H:%M:%S') tz = dt.utcoffset() if tz is None: fmt_timezone = "+00:00" else: fmt_timezone = str.format('{0:+06.2f}', float(tz.total_seconds() / 3600)) return fmt_datetime + fmt_timezone 
     import datetime, time def convert_enddate_to_seconds(self, ts): """Takes ISO 8601 format(string) and converts into epoch time.""" dt = datetime.datetime.strptime(ts[:-7],'%Y-%m-%dT%H:%M:%S.%f')+\ datetime.timedelta(hours=int(ts[-5:-3]), minutes=int(ts[-2:]))*int(ts[-6:-5]+'1') seconds = time.mktime(dt.timetuple()) + dt.microsecond/1000000.0 return seconds >>> import datetime, time >>> ts = '2012-09-30T15:31:50.262-08:00' >>> dt = datetime.datetime.strptime(ts[:-7],'%Y-%m-%dT%H:%M:%S.%f')+ datetime.timedelta(hours=int(ts[-5:-3]), minutes=int(ts[-2:]))*int(ts[-6:-5]+'1') >>> seconds = time.mktime(dt.timetuple()) + dt.microsecond/1000000.0 >>> seconds 1348990310.26 
    Python ist die beste Programmiersprache der Welt.