为什么%z不受python的strptime支持?

时间:2014-05-29 18:37:10

标签: python datetime timezone strptime python-datetime

>>> 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'

我知道它不受支持,但不知道为什么。似乎并不难以支持。并且&#39; Offset from UTC&#39;并不像时区缩写那样含糊不清。

2 个答案:

答案 0 :(得分:5)

在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))

答案 1 :(得分:0)

这是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