In Python, wie man FULL ISO 8601 Zeitstempel, einschließlich der aktuellen Zeitzone zu drucken

Ich muss das FULL lokale Datum / Uhrzeit in ISO 8601 Format, einschließlich der lokalen Zeitzone Info, zB:

2007-04-05T12:30:00.0000-02:00 

Ich kann datetime.isoformat() , um es zu drucken, wenn ich das richtige tzinfo Objekt habe – aber wie bekomme ich das?

  • Python - Schwierigkeiten beim Aufbau von ausführbaren Dateien
  • Parsing CSV-Datei in Pandas mit Kommas in der letzten Spalte
  • Was ist das Python-Äquivalent von statischen Variablen innerhalb einer Funktion?
  • Umschalttaster
  • Label-Codierung über mehrere Spalten in scikit-learn
  • Python PyBluez Verbindung zu passkey geschützten Gerät
  • Beachten Sie, ich stecke bei Python 2.5, was einige Verfügbarkeit von Optionen reduzieren kann.

    2 Solutions collect form web for “In Python, wie man FULL ISO 8601 Zeitstempel, einschließlich der aktuellen Zeitzone zu drucken”

    Ich habe meinen eigenen Weg ausgearbeitet, um dies zu tun, hoffentlich wird dies für jeden anderen nützlich sein, um nützliche Zeitstempel in Ausgabedateien zu drucken.

     import datetime # get current local time and utc time localnow = datetime.datetime.now() utcnow = datetime.datetime.utcnow() # compute the time difference in seconds tzd = localnow - utcnow secs = tzd.days * 24 * 3600 + tzd.seconds # get a positive or negative prefix prefix = '+' if secs < 0: prefix = '-' secs = abs(secs) # print the local time with the difference, correctly formatted suffix = "%s%02d:%02d" % (prefix, secs/3600, secs/60%60) now = localnow.replace(microsecond=0) print "%s%s" % (now.isoformat(' '), suffix) 

    Das fühlt sich ein wenig hacky an, aber scheint der einzige zuverlässige Weg, um eine lokale Zeit mit dem richtigen UTC-Offset zu bekommen. Bessere Antworten willkommen!

    Die python-Standardbibliothek stellt keine tzinfo-Implementierung zur Verfügung. Sie müssen es subklassen. Beispiele sind im datetime-Modul enthalten .

    Die akzeptierte Antwort liefert falsche Ergebnisse. Zum Beispiel in meiner Zeitzone +02 ist das Ergebnis +01: 59. Dies ist, weil Mikrosekundenwechsel auf 0 muss auf lokal durchgeführt werden und utcnow, bevor die Differenz berechnet wird.

    Hier eine Version von mir für Python 2.5:

     # coding=utf-8 def isoformat_offset(dt, offset, dt_sep='T', hm_sep=True, short=True): """Return a string representing the date and time in ISO 8601 format, YYYY-MM-DDTHH:MM:SS.mmmmmm+HH:MM. If microseconds is 0 .mmmmmm is omitted. The optional argument dt_sep (default 'T') is a one-character separator, placed between the date and time portions of the result. The optional argument hm_Sep (default True) indicates if a : separator should be placed between the hours and minutes portions of the time zone designator. The optional argument short (default True) defines if the minute portion of the time zone designator should be omitted in the case of zero minutes. >>> from datetime import datetime >>> cur = datetime(2017, 4, 26, 17, 14, 23, 123456) >>> off = 2 * 3600 # +02:00 >>> isoformat_offset(cur, off) '2017-04-26T17:14:23.123456+02' >>> isoformat_offset(cur, off, ' ') '2017-04-26 17:14:23.123456+02' >>> isoformat_offset(cur, off, hm_sep=False) '2017-04-26T17:14:23.123456+02' >>> isoformat_offset(cur, off, short=False) '2017-04-26T17:14:23.123456+02:00' >>> isoformat_offset(cur, off, hm_sep=False, short=False) '2017-04-26T17:14:23.123456+0200' >>> cur = cur.replace(microsecond=0) >>> isoformat_offset(cur, off) '2017-04-26T17:14:23+02' >>> off = -2 * 3600 # -02:00 >>> isoformat_offset(cur, off) '2017-04-26T17:14:23-02' >>> off = 2 * 3600 + 30 * 60 # +02:30 >>> isoformat_offset(cur, off) '2017-04-26T17:14:23+02:30' >>> isoformat_offset(cur, off, hm_sep=False) '2017-04-26T17:14:23+0230' """ offset_hours = offset // 3600 offset_mins = (offset - offset_hours * 3600) // 60 frmt = '%s%+03d' args = [dt.isoformat(dt_sep), offset_hours] if (short is True and offset_mins > 0) or (short is False and offset_mins == 0): if hm_sep is True: frmt += ':' frmt += '%02d' args.append(offset_mins) return frmt % tuple(args) if __name__ == '__main__': import doctest doctest.testmod() 

    Um die lokale Zeitzone in Sekunden als Notwendigkeit für diese Funktion zu erhalten, verwenden Sie negierte altzone aus Zeitmodul:

     from datetime import datetime import time now = datetime.now() offset = -time.altzone print(isoformat_offset(now, offset)) 
    Python ist die beste Programmiersprache der Welt.