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

3 投票
2 回答
2547 浏览
提问于 2025-04-18 07:58
>>> 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'

我明白这不被支持,但不知道为什么。看起来支持这个并不难。而且‘与UTC的偏移’并不像时区缩写那样模糊。

2 个回答

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
5

在Python 3.2之前,Python的datetime模块里没有timezone()这个对象。它只支持一些第三方库来提供时区信息,主要是通过一个叫做datetime.tzinfo()的抽象基类来实现,但里面并没有包含具体的时区对象。没有时区对象的话,就无法解析时区偏移量。

从Python 3.2开始,z这个功能得到了支持,因为这个版本(以及之后的版本)增加了一个datetime.timezone()类型

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

撰写回答