2009-08-19 4 views
6

Angenommen, ich habe eine Zeitzone wie "2009-08-18 13: 52: 54-04". Ich kann die meisten davon mit einer Zeile wie folgt analysieren:Wie parse ich Zeitzonen mit UTC-Offsets in Python?

datetime.strptime(time_string, "%Y-%m-%d %H:%M:%S") 

aber ich kann nicht die Zeitzone an der Arbeit. Es gibt ein% Z, das textuelle Zeitzonen ("EST", "UTC" usw.) behandelt, aber ich sehe nichts, was "-04" parsen kann.

+0

Dupe- [Wie kann ich eine ISO 8601-Datetime-Zeichenfolge in ein Objekt Python Datetime übersetzen?] (Http://stackoverflow.com/questions/969285/how-do-ich-übersetzen-ein-iso-8601-datetime-zeichenfolge-in-a-python-datetime-objekt/3908349 # 3908349) (und die Antwort ist 'dateutil.parser.parse (datastring) 'in beiden) – Yarin

+0

verwandt: [Wie analysiert man Daten mit -0400 Zeitzone Zeichenfolge in Python?] (http://Stackoverflow.com/q/1101508/4279) – jfs

Antwort

0

Ich lief über die gleiche Frage vor kurzem und arbeitete um es mit diesem Code:

gmt_offset_str = time_string[-3:] 
gmt_offset_seconds = int(gmt_offset_str)*60*60 
timestamp = time.strptime(time_string[:-4], '%Y-%m-%d %H:%M:%S') 
return time.localtime(time.mktime(timestamp)-gmt_offset_seconds) 

ich auch in einer eleganteren Lösung interessiert sei.

+3

Es ist a eher naive Lösung. Es funktioniert, aber Sie werden hässliche Probleme bekommen, wenn Sie tagsüber sparen und die nicht verwenden. Es ist besser, die eingebauten Objekte zu verwenden. – voyager

+0

'mktime()' ist hier falsch. Verwenden Sie stattdessen 'calendar.timegm()'. 'email.utils.mktime_tz' von stdlib hatte den gleichen Fehler vor Python 2.7.4 – jfs

0

Sie können das tun directrly auf den Konstruktor: class datetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[,Tzinfo]]]]]), Tzinfo ein Objekt datetime.tzinfo dervided zu sein.

tzinfo ist eine abstrakte Basisklasse, was bedeutet, dass diese Klasse nicht direkt instanziiert werden sollte. Sie müssen eine konkrete Unterklasse ableiten und (zumindest) Implementierungen der Standard-TZInfo-Methoden bereitstellen, die von den von Ihnen verwendeten DateTime-Methoden benötigt werden. Das datetime-Modul liefert keine konkreten Unterklassen von tzinfo.

Was Sie überschreiben müssen, ist die utcoffset(self, dt) Methode.

Rückgabe-Offset der Ortszeit von UTC, in Minuten östlich von UTC. Wenn die Ortszeit westlich von UTC liegt, sollte dies negativ sein. Beachten Sie, dass dies der Gesamt-Offset von UTC sein soll; Wenn beispielsweise ein TZInfo-Objekt sowohl die Zeitzonen- als auch die DST-Anpassung darstellt, sollte utcoffset() die Summe zurückgeben. Wenn der UTC-Offset nicht bekannt ist, geben Sie None zurück. Andernfalls muss der zurückgegebene Wert ein timedelta-Objekt sein, das eine ganze Anzahl von Minuten im Bereich von -1439 bis einschließlich 1439 angibt (1440 = 24 * 60; die Größe des Offsets muss kleiner als ein Tag sein). Die meisten Implementierungen von UTCOFFSET() wird wie eine der beiden aussehen wahrscheinlich:

return CONSTANT # fixed-offset class

return CONSTANT + self.dst(dt) # daylight-aware class

Wenn UTCOFFSET() nicht None zurück, dst() sollte nicht Keine entweder zurück.

Die Standardimplementierung von utcoffset() löst NotImplementedError aus.

22

Vielleicht könnten Sie dateutil.parser.parse verwenden? Diese Methode wird auch unter der Nummer wiki.python.org/WorkingWithTime erwähnt.

>>> from dateutil.parser import parse 
>>> parse("2009-08-18 13:52:54-04") 
datetime.datetime(2009, 8, 18, 13, 52, 54, tzinfo=tzoffset(None, -14400)) 

(diese Frage ist ein Duplikat?)

+3

+1 für Datum. Das ist deine Antwort – Yarin