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