Zeitzonen und Sommerzeit
Verfasst: Freitag 31. Juli 2015, 07:29
Hallo allerseits,
ich verzweifle momentan an einer Aufgabe, die eigentlich ziemlich einfach und auch alltäglich sein sollte: Timestamps in Strings umwandeln und wieder zurück unter korrekter Behandlung von Zeitzonen und Sommerzeit.
Offenbar funktioniert das in der sonst sehr umfangreichen Standardbibliothek nur unter Hinzunahme von "dateutil". Aber auch dann kommt nicht wirklich das heraus, was man erwartet. Folgende Testergebnisse bei mir (lokale Zeitzone ist CET):
Wie kann denn das beides dasselbe ergeben? Da hätte ich jetzt erwartet, dass die Zeitzone einmal mit "CET" und einmal mit "CEST" rauskommt. (Anm.: Die Timestamps liegen eine Stunde auseinander und das ist genau die Stunde, wo dieses Jahr die Winterzeit anfängt.)
Anders herum genau dasselbe:
... ergibt auch beides mal dasselbe.
Mit dem einfacheren Modul "time" funktioniert zwar die Sommerzeit halbwegs, aber dafür macht es offenbar alles nur in der lokalen Zeitzone:
Zum Vergleich mal mit GNU date in der Kommondozeile. Das macht imho alles richtig:
Wenn jemand einen Tipp hat, wie man diese scheinbar sehr simple Aufgabe in Python umsetzen kann, wäre ich dankbar 
Gegooglet habe ich, da bin ich bisher nur auf dateutil gestoßen, aber, wie man sieht, hilft das auch nicht.
ich verzweifle momentan an einer Aufgabe, die eigentlich ziemlich einfach und auch alltäglich sein sollte: Timestamps in Strings umwandeln und wieder zurück unter korrekter Behandlung von Zeitzonen und Sommerzeit.
Offenbar funktioniert das in der sonst sehr umfangreichen Standardbibliothek nur unter Hinzunahme von "dateutil". Aber auch dann kommt nicht wirklich das heraus, was man erwartet. Folgende Testergebnisse bei mir (lokale Zeitzone ist CET):
Code: Alles auswählen
import datetime, dateutil.tz, dateutil.parser
datetime.datetime.fromtimestamp(1445733000, dateutil.tz.tzlocal()).strftime('%H:%M %Z') # '02:30 CET'
datetime.datetime.fromtimestamp(1445736600, dateutil.tz.tzlocal()).strftime('%H:%M %Z') # '02:30 CET'Anders herum genau dasselbe:
Code: Alles auswählen
dateutil.parser.parse('2015-10-25 02:30:00 CET')
dateutil.parser.parse('2015-10-25 02:30:00 CEST')Mit dem einfacheren Modul "time" funktioniert zwar die Sommerzeit halbwegs, aber dafür macht es offenbar alles nur in der lokalen Zeitzone:
Code: Alles auswählen
time.mktime(time.strptime("2015-10-25 02:30:00 CET", "%Y-%m-%d %H:%M:%S %Z")) # 1445736600.0
time.mktime(time.strptime("2015-10-25 02:30:00 CEST", "%Y-%m-%d %H:%M:%S %Z")) # 1445733000.0
# soweit war das richtig, das war schon mal besser als mit datetime/dateutil. Aber nun:
time.mktime(time.strptime("2015-10-25 02:30:00 UTC", "%Y-%m-%d %H:%M:%S %Z")) # 1445736600.0 -> falsch.
Code: Alles auswählen
$ date +%s -d '2015-10-25 02:30:00 UTC'
1445740200
$ date +%s -d '2015-10-25 02:30:00 CET'
1445736600
$ date +%s -d '2015-10-25 02:30:00 CEST'
1445733000Gegooglet habe ich, da bin ich bisher nur auf dateutil gestoßen, aber, wie man sieht, hilft das auch nicht.