PyYAML可以解析iso8601的日期吗?

时间:2012-11-08 17:15:11

标签: python timezone iso pyyaml

According to the YAML spec, iso8601 dates with timezones should be recognised。但是,在尝试使用PyYAML 3.10解析它们时(在Windows 7上使用ActivePython 2.7.2.5)我得到了天真的日期:

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无法正常工作?

4 个答案:

答案 0 :(得分:9)

如果您不喜欢默认行为(天真的utc datetime,utc offset丢失),您可以提供自己的构造函数:

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))

答案 1 :(得分:7)

这是reported bug in PyYAML。我没有看到任何迹象表明它已被修复或工作。

答案 2 :(得分:0)

从YAML文件加载数据库装置时,这也会影响Django。有一个特定于Django的解决方法;参见:Loaddata not dealing with timestamps and timezones properly

答案 3 :(得分:0)

自pyyaml 5.3(Github Pull Request)起已修复此问题

>>> yaml.safe_load('2020-12-17t14:40:00+02:00')
datetime.datetime(2020, 12, 17, 14, 40, tzinfo=datetime.timezone(datetime.timedelta(seconds=7200)))