2012-11-08 48 views
6

According to the YAML spec, iso8601 dates with timezones should be recognised。然而,在試圖用他們3.10 PyYAML解析(在Windows 7的ActivePython 2.7.2.5)我得到天真日期:PyYAML可以解析iso8601日期嗎?

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) 

(第一格式是嚴格的ISO8601和第二個是「放鬆」格式;採取實例直接從YAML規範。)

這是預期的行爲,或者是我PyYaml不能正常工作?

回答

6

這是一個reported bug in PyYAML。我沒有看到任何跡象表明它已被修復或正在進行。

+0

所以我們目前無法解析使用PyYAML時區感知日期的方式是什麼?是否有可能強制日期是一個字符串,然後使用python-dateutil解析字符串? –

+0

我在PyYAML API中看不到任何東西,它可以讓您關閉隱式標記解析... –

+0

好的,非常感謝。 –

9

如果你不喜歡默認的行爲(UTC天真的日期時間,UTC偏移量丟失),你可以提供自己的構造函數:

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

非常酷,這是一個很好的解決方法,謝謝! –