【问题标题】:Unserialize Python aware datetime反序列化 Python 感知的日期时间
【发布时间】:2014-02-16 07:49:55
【问题描述】:

如何反序列化时区感知的日期时间对象? 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))

【问题讨论】:

  • 这是一个正确的结果。 7200 = 2 * 60 * 60 = hour_offset * 60*minutes/hour * 60*seconds/minute。它无法知道您在雅典,因为这是一个字符串,如果字符串中未显示信息,则会丢失信息。您将需要一种允许城镇的格式。
  • “反序列化可识别时区的日期时间对象”是什么意思?要将其转换为已知时区还是仅将其输出为字符串?
  • 看看这个问题。许多答案都谈到了处理时区感知对象:stackoverflow.com/questions/969285/…
  • 用户 - 检查。如果您将其写为答案,我会将其标记为正确。

标签: python datetime serialization timezone yaml


【解决方案1】:

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

例如:

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

【讨论】:

  • 要获取时区 ID,x.tzinfo.zone 可以与 pytz 时区一起使用(例如在这种情况下)。如果 datetime 被序列化为 UTC 时间,则可以调用 utc_aware.astimezone(tz),以在 tz 时区获取可感知的 datetime 对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
相关资源
最近更新 更多