PyYAML能解析iso8601日期吗?

6

根据YAML规范,应该能够识别带有时区的iso8601日期。然而,在尝试使用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工作不正常?

3个回答

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

2

这个问题已经在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)))

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接