【问题标题】:Why %z is not supported by python's strptime?为什么python的strptime不支持%z?
【发布时间】:2014-07-19 09:13:38
【问题描述】:
>>> datetime.strptime('2014-02-13 11:55:00 -0800', '%Y-%m-%d %H:%M:%S %z')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 317, in _strptime
    (bad_directive, format))
ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M:%S %z'

我知道它不受支持,但不知道为什么。似乎不难支持。而且'Offset from UTC'不像时区缩写那样模棱两可。

【问题讨论】:

标签: python datetime timezone strptime python-datetime


【解决方案1】:

在 Python 3.2 之前,Python 的 datetime 模块没有 timezone() 对象。它支持通过提供datetime.tzinfo() abstract base class 来提供时区的第三方库,但没有包含时区对象。如果没有时区对象,也不支持解析时区偏移量。

从 Python 3.2 开始,支持 z,因为该版本(及更高版本)添加了 datetime.timezone() type

>>> import datetime
>>> datetime.datetime.strptime('2014-02-13 11:55:00 -0800', '%Y-%m-%d %H:%M:%S %z')
datetime.datetime(2014, 2, 13, 11, 55, tzinfo=datetime.timezone(datetime.timedelta(-1, 57600)))
>>> _.tzinfo
datetime.timezone(datetime.timedelta(-1, 57600))

【讨论】:

    【解决方案2】:

    这是针对 python 2.7 的修复

    而不是使用:

    datetime.strptime(t,'%Y-%m-%dT%H:%M %z')
    

    使用timedelta 表示时区,如下所示:

    from datetime import datetime,timedelta
    def dt_parse(t):
        ret = datetime.strptime(t[0:16],'%Y-%m-%dT%H:%M')
        if t[18]=='+':
            ret+=timedelta(hours=int(t[19:22]),minutes=int(t[23:]))
        elif t[18]=='-':
            ret-=timedelta(hours=int(t[19:22]),minutes=int(t[23:]))
        return ret
    

    【讨论】:

      猜你喜欢
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      相关资源
      最近更新 更多