【问题标题】:How do I parse timezones with UTC offsets in Python?如何在 Python 中使用 UTC 偏移量解析时区?
【发布时间】:2009-08-19 19:30:17
【问题描述】:

假设我有一个像“2009-08-18 13:52:54-04”这样的时区。我可以使用这样的一行来解析大部分内容:

datetime.strptime(time_string, "%Y-%m-%d %H:%M:%S")

但是,我无法使用时区。有一个 %Z 可以处理文本时区(“EST”、“UTC”等),但我看不到任何可以解析“-04”的东西。

【问题讨论】:

标签: python datetime


【解决方案1】:

也许你可以使用dateutil.parser.parsewiki.python.org/WorkingWithTime也提到了这个方法。

>>> from dateutil.parser import parse
>>> parse("2009-08-18 13:52:54-04")
datetime.datetime(2009, 8, 18, 13, 52, 54, tzinfo=tzoffset(None, -14400))

(这个问题是重复的吗?)

【讨论】:

    【解决方案2】:

    使用Babel,特别是parse_datetime

    【讨论】:

      【解决方案3】:

      我最近遇到了同样的问题,并使用以下代码解决了这个问题:

      gmt_offset_str = time_string[-3:]
      gmt_offset_seconds = int(gmt_offset_str)*60*60
      timestamp = time.strptime(time_string[:-4], '%Y-%m-%d %H:%M:%S')
      return time.localtime(time.mktime(timestamp)-gmt_offset_seconds)
      

      我也对更优雅的解决方案感兴趣。

      【讨论】:

      • 这是一个相当幼稚的解决方案。它可以工作,但是在白天节省时间和不使用它的时间工作时,您会遇到难看的问题。最好使用内置对象。
      • mktime() 此处不正确。请改用calendar.timegm()。来自 stdlib 的email.utils.mktime_tz 在 Python 2.7.4 之前有同样的错误
      【解决方案4】:

      您可以直接在构造函数上执行此操作:class datetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]]),tzinfo 是一个datetime.tzinfo dervided 对象。

      tzinfo 是一个抽象基类,这意味着不应直接实例化此类。您需要派生一个具体的子类,并且(至少)提供您使用的 datetime 方法所需的标准 tzinfo 方法的实现。 datetime 模块不提供 tzinfo 的任何具体子类。

      您需要重写的是utcoffset(self, dt) 方法。

      返回本地时间与 UTC 的偏移量,以 UTC 以东的分钟数为单位。如果当地时间在 UTC 以西,这应该是负数。请注意,这是与 UTC 的总偏移量;例如,如果 tzinfo 对象同时表示时区和 DST 调整,utcoffset() 应该返回它们的总和。如果 UTC 偏移量未知,则返回 None。否则,返回的值必须是一个 timedelta 对象,指定范围为 -1439 到 1439 的整数分钟数(1440 = 24*60;偏移量必须小于一天)。 utcoffset() 的大多数实现可能看起来像这两个之一:

      return CONSTANT # fixed-offset class

      return CONSTANT + self.dst(dt) # daylight-aware class

      如果 utcoffset() 不返回 None,则 dst() 也不应该返回 None。

      utcoffset() 的默认实现引发 NotImplementedError。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-18
        • 2014-02-04
        • 2016-01-06
        • 2020-10-21
        • 1970-01-01
        • 2010-11-19
        • 2012-07-24
        • 1970-01-01
        相关资源
        最近更新 更多