我的datetime.strptime格式有什么问题?

时间:2018-10-28 15:37:44

标签: python python-datetime

具有此功能:

timestamp = datetime.strptime(date_str, date_fmt)

我收到此错误:

  

ValueError:时间数据'Sun,28 Oct 2018 07:33:13 -0400(EDT)'不   匹配格式'%a,%d%b%Y%H:%M:%S%z(%Z)'

Sun, 28 Oct 2018 07:33:13 -0400 (EDT)
%a, %d %b %Y %H:%M:%S %z (%Z)

我已经looked over it a dozen times,但我不知道自己在做什么错。

我的Python版本:

Python 3.7.0 (default, Jul 23 2018, 20:24:19) 

1 个答案:

答案 0 :(得分:6)

除了您的当前时区以外,其他任何输入都不支持%Z。只会识别time.tzname tuple加上'UTC''GMT'中的字符串:

>>> from datetime import datetime
>>> import time
>>> time.tzname
('GMT', 'BST')
>>> sample = 'Sun, 28 Oct 2018 07:33:13 -0400 (EDT)'
>>> datetime.strptime(sample.replace('EDT', time.tzname[0]), '%a, %d %b %Y %H:%M:%S %z (%Z)')
datetime.datetime(2018, 10, 28, 7, 33, 13, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=72000), 'GMT'))
>>> datetime.strptime(sample.replace('EDT', time.tzname[1]), '%a, %d %b %Y %H:%M:%S %z (%Z)')
datetime.datetime(2018, 10, 28, 7, 33, 13, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=72000), 'BST'))

由于字符串中还有一个与UTC的偏移量(-0400部分),因此只需从输入中删除时区名称,而不必费力解析它:

>>> datetime.strptime(sample.rpartition(' ')[0], '%a, %d %b %Y %H:%M:%S %z')
datetime.datetime(2018, 10, 28, 7, 33, 13, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=72000)))

我在这里使用str.rpartition()来删除从最后一个空格开始的所有内容,但这取决于您如何最好地删除应用程序中的时区名称部分的输入。没有它,就不需要(%Z)部分,您将获得正确的datetime对象。

在调试datetime.strptime()问题时,您希望对该问题进行隔间。您可以将输入和模板部分一分为二,以查看问题所在,或一一尝试不同的组件。可能是导致问题的单个指令,也可能是多个指令,所以我通常会一步一步删除指令,直到可行为止。