反序列化Python感知日期时间

时间:2014-02-16 07:49:56

标签: python datetime serialization timezone yaml

如何反序列化时区感知日期时间对象? PYYAML将自动以ISO格式正确保存它们,但在加载时会丢弃时区信息。使用str(my_datetime_object)生成正确的ISO字符串,但datetime模块没有干净的方法将其转换回datetime对象。 (strftime没有与ISO兼容的时区格式)

dateutil.parser.parse做了一些奇怪的事情仍然不对:

In [113]: x
Out[113]: datetime.datetime(2014, 2, 15, 21, 58, 25, 866385, tzinfo=<DstTzInfo 'Europe/Athens' EET+2:00:00 STD>)

In [114]: str(x)
Out[114]: '2014-02-15 21:58:25.866385+02:00'

In [115]: dateutil.parser.parse(str(x))
Out[115]: datetime.datetime(2014, 2, 15, 21, 58, 25, 866385, tzinfo=tzoffset(None, 7200))

1 个答案:

答案 0 :(得分:1)

您应该将其序列化为日期时间和时区。时区应存储为时区名称,在本例中为'Europe/Athens'。您对日期时间使用的格式不太重要,但我建议将日期时间序列化为与时区相对应的单独字段,并使用UTC,并明确说明。这看起来更明确的方式完全取决于您的seialization格式的其余部分。

例如:

{datetime: "2014-02-15 19:58:25.866385+00:00", timezone: "Europe/Athens"}