【问题标题】:Converting Iso8601 with non-decimal UTC zone offest [duplicate]使用非十进制 UTC 区域偏移量转换 Iso 8601 [重复]
【发布时间】:2015-12-22 21:07:22
【问题描述】:

如何修改下面的代码来处理时区,注意没有小数。

2015-12-22T11:57:11-08:00, -8:00 引起我的问​​题,纪元时间是否考虑时区?

timegm(datetime.strptime(datestring, "%Y-%m-%dT%H:%M:%S.%f").timetuple())

【问题讨论】:

  • @Padraic Cunningham 不重复,因为缺少“正常”时间字符串的一部分

标签: python time iso8601


【解决方案1】:

这里有几个问题。

  1. 如果您的时间不包含微秒块,则此日期字符串将不适用于您提供的格式字符串。只需尝试不使用 -08:00 位即可。这意味着您要么需要假设您的所有时间都不会出现该块,要么您需要考虑这两种可能性。
  2. strptime 在处理 ISO8601 偏移方面做得很糟糕。如果您查看格式指南,您会注意到可以使用 %z 表示 +/-HHMM,但 ISO8601 时区(根据我的经验)几乎总是以 +/-HH:MM 格式显示。即便如此,%z 也有一个讨厌的习惯,即在格式字符串中被称为错误指令。

要回答您的问题,是的,时区很重要。 UNIX 纪元是自 1970-01-01T00:00:00+00:00 以来的秒数。更重要的是,即使您在解析字符串时正确分配了datetime 对象的tzinfotimetuple 也不会考虑到tzinfo。你需要使用utctimetuple

所以现在您只需要正确解析日期时间。有些解决方案不使用外部库,但我发现解析 ISO8601 日期字符串的最简单方法是使用通过 pip 提供的 python-dateutil 包:

>>> import calendar
>>> from dateutil import parser
>>> datestring = '2015-12-22T11:57:11-08:00'
>>> tz_aware_datetime = parser.parse(datestring)
>>> tz_aware_datetime
datetime.datetime(2015, 12, 22, 11, 57, 11, tzinfo=tzoffset(None, -28800))
>>> calendar.timegm(tz_aware_datetime.utctimetuple())
1450814231

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 2011-07-08
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多