Pyyaml可以解析ISO8601日期



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

如果您不喜欢默认行为(naive utc datetime,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))

这是在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)))

这也会影响django从yaml文件加载数据库固定装置时。有一个特定于Django的解决方法;请参阅:LoadData不正确处理时间戳和时区

相关内容

  • 没有找到相关文章

最新更新