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

标签 python python-datetime

有了这个功能:

timestamp = datetime.strptime(date_str, date_fmt)

我收到这个错误:

ValueError: time data 'Sun, 28 Oct 2018 07:33:13 -0400 (EDT)' does not match format '%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) 

最佳答案

对于 当前时区 以外的任何输入,不支持 %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'))

即使您在输入中使用“已知”时区名称,该名称也会被忽略,除非输入中也有时区偏移量 (%z);带有 %z 偏移量的它仅用于设置 datetime.timezone() instancename 参数这是从 %z 偏移量构造的。

不幸的是,此行为没有明确记录,请参阅 Python 问题 #22377#22426 .文档似乎暗示EST%Z 解析的可接受值,但文档的该部分仅显示datetime.strftime() 字符串输出,不接受datetime.strptime() 字符串输入。

由于您在字符串中也有与 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() 问题时,您希望划分 问题。您可以将输入和模板部分一分为二以查看问题出在哪里,或者一个一个地尝试不同的组件。它可能是导致问题的单个指令,也可能是多个指令,因此我通常会单步删除指令,直到一个指令起作用。


对于那些对 datetime.strptime() 工作原理的细节感兴趣的人,您可以使用调试器作为实现进入调用 uses a pure Python module .对于 datetime.strptime(),入口点是 _strptime._strptime_datetime()%Z参数匹配模式由this little loop生成,其中 self.locale_time.timezone 是具有 3 个字母字符串的 frozensets 的 2 值元组,由 LocaleTime.__calc_timezone() method 设置.

关于python - 我的 datetime.strptime 格式有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53033221/

相关文章:

python - 动态导入python模块

python - 在 pandas 中读取 csv 文件时出错[CParserError : Error tokenizing data. C 错误 : Buffer overflow caught - possible malformed input file.]

python - Django Rest Framework - 序列化方法字段

python - 为什么在使用softmax_cross_entropy_with_logits时网络的输出不能经过一个softmax?

python - 使用 python 获取上周日期?

python - 反向 Pandas to_datetime() 方法获取时间戳

python - 在 python 的这个简单示例中,我如何才能仅提取时间?

python - 我如何检查日期是否在 Python 的范围内?

python - 无法从 'Sequence' 导入名称 'keras.utils'

python - 如何仅使用标准库将 UTC 日期时间转换为本地日期时间?