Python 将Iso8601转换为非十进制UTC区域OFFET

Python 将Iso8601转换为非十进制UTC区域OFFET,python,time,iso8601,Python,Time,Iso8601,我如何修改下面的代码来处理时区,注意没有十进制 2015-12-22T11:57:11-08:00,-8:00引起了我的问题,大纪元时间是否考虑了时区 timegm(datetime.strptime(datestring, "%Y-%m-%dT%H:%M:%S.%f").timetuple()) 这里有几个问题 如果您的时间不包括微秒块,则此日期字符串将无法与您提供的格式字符串一起使用。不用-08:00就试试吧。这意味着你要么需要假设你所有的时间都不会有那个障碍,要么你需要考虑这两种可能性

我如何修改下面的代码来处理时区,注意没有十进制

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

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

这里有几个问题

  • 如果您的时间不包括微秒块,则此日期字符串将无法与您提供的格式字符串一起使用。不用-08:00就试试吧。这意味着你要么需要假设你所有的时间都不会有那个障碍,要么你需要考虑这两种可能性
  • strtime在处理ISO8601偏移量方面做得很糟糕。如果你看一下格式化指南,你会注意到你可以用%z表示+/-HHMM,但是ISO8601时区(以我的经验)几乎总是以+/-HH:MM的格式表示。即使这样,%z也有一个坏习惯,就是在格式字符串中被称为坏指令
  • 回答你的问题,是的,时区很重要。UNIX纪元自1970-01-01T00:00:00+00:00起为秒。更重要的是,即使在解析字符串时正确分配了
    datetime
    对象的
    tzinfo
    timetuple
    也不会考虑该
    tzinfo
    。您需要使用
    utctimetuple

    现在只需要正确解析datetime。有一些解决方案不使用外部库,但我发现解析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
    

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