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

4

3 回答 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))
于 2012-11-08T18:46:15.437 回答
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)))
于 2020-12-17T12:51:31.777 回答
0

从 YAML 文件加载数据库设备时,这也会影响 Django。有一个特定于 Django 的解决方法;请参阅:Loaddata 未正确处理时间戳和时区

于 2019-01-08T19:45:15.847 回答