Cha*_*per 6 python timezone iso pyyaml
根据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)
Run Code Online (Sandbox Code Playgroud)
(第一种格式是严格的iso8601,第二种是'宽松'格式;示例直接取自YAML规范.)
这是预期的行为,还是我的PyYaml无法正常工作?
如果您不喜欢默认行为(天真的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))
Run Code Online (Sandbox Code Playgroud)
从 pyyaml 5.3 开始,此问题已修复(Github Pull 请求)
>>> yaml.safe_load('2020-12-17t14:40:00+02:00')
datetime.datetime(2020, 12, 17, 14, 40, tzinfo=datetime.timezone(datetime.timedelta(seconds=7200)))
Run Code Online (Sandbox Code Playgroud)