2012-11-08 12 views
6

According to the YAML spec, iso8601 dates with timezones should be recognised. Aber zu versuchen, sie PyYAML 3,10 (auf Windows 7 mit Active 2.7.2.5) bekomme ich naiv Daten verwenden zu analysieren:Kann PyYAML iso8601 Daten analysieren?

In [7]: yaml.load("2001-12-14t21:59:43.10-05:00") 
Out[7]: datetime.datetime(2001, 12, 15, 2, 59, 43, 100000) 

In [8]: yaml.load("2001-12-14 21:59:43.10 -5") 
Out[8]: datetime.datetime(2001, 12, 15, 2, 59, 43, 100000) 

(Erstes Format ist die strenge ISO8601 und die zweite ist die ‚entspannte‘ Format; Beispiele genommen direkt von YAML spec.)

Ist dieses erwartete Verhalten, oder funktioniert mein PyYaml nicht richtig?

Antwort

6

Dies ist ein reported bug in PyYAML. Ich sehe keinen Hinweis darauf, dass es repariert oder bearbeitet wurde.

+0

So gibt es derzeit keine Möglichkeit der Parsen Zeitzone-aware Daten PyYAML mit? Ist es möglich, das Datum zu einer Zeichenkette zu zwingen und dann die Zeichenkette mit python-dateutil zu analysieren? –

+0

Ich sehe nichts in der PyYAML-API, mit der Sie die implizite Tag-Auflösung ausschalten können ... –

+0

Okay, vielen Dank. –

9

Wenn Sie nicht wie das Standardverhalten (naiver utc datetime, utc verlorene Offset) Sie Ihren eigenen Konstruktor bieten könnten:

import dateutil.parser 
import yaml 

def timestamp_constructor(loader, node): 
    return dateutil.parser.parse(node.value) 
yaml.add_constructor(u'tag:yaml.org,2002:timestamp', timestamp_constructor) 

print(repr(yaml.load("2001-12-14T21:59:43.10-05:00"))) 
# -> datetime.datetime(2001, 12, 14, 21, 59, 43, 100000, tzinfo=tzoffset(None, -18000)) 
+0

Sehr cool, das ist ein guter Workaround, danke! –