首页 > 解决方案 > strptime() 给出 ValueError:时间数据 'AM CDT' 与格式 '%p %Z' 不匹配

问题描述

我有一个要转换为日期时间的 str 。这个字符串是这样的:'CDT 2021 年 9 月 9 日星期四上午 11:50。我正在使用 datetime.strptime() 函数,但似乎无法识别 AM 或时区。

当我使用代码时

time = 'Thursday, September 9, 2021 at 11:50 AM CDT'
time = datetime.strptime(time, '%A, %B %d, %Y at %I:%M %p %Z')

我得到以下信息: ValueError: time data 'Thursday, September 9, 2021 at 11:50 AM CDT' does not match format '%A, %B %d, %Y at %I:%M %p %Z:%M %p %Z'

我已经能够将第一部分转换为 %p %Z 部分,此时我收到以下错误:

ValueError: time data 'AM CDT' does not match format '%p %Z'

关于 dt.strptime() 如何正确识别 AM/PM 和时区的任何想法?

标签: pythondatetime

解决方案


不确定最好的方法,但从 Python 3.9 开始,您可以使用该ZoneInfo模块:

from datetime import datetime
from zoneinfo import ZoneInfo


CDT = ZoneInfo('CST6CDT')
# or alternatively:
# CDT = ZoneInfo('US/Central')

time = 'Thursday, September 9, 2021 at 1:50 PM'
time = datetime.strptime(time, '%A, %B %d, %Y at %I:%M %p')
time = time.replace(tzinfo=CDT)

print(time)  # 2021-09-09 13:50:00-05:00

@MrFuppes 很好地说明了CST6EDTUS/Central区域之间的歧义。但是,当我尝试在 DST 和 DST 之外进行快速测试时,我看不到任何明显的差异,因为时区似乎会自动调整 - 这表明这些区域值中的任何一个似乎都是 DST 感知的(除非我我当然错过了一些东西)。

我在下面添加了一个示例:

from datetime import datetime
from zoneinfo import ZoneInfo


# CDT = ZoneInfo('CST6CDT')
CDT = ZoneInfo('US/Central')

# Note: DST in 2021, ends on November 7th
time_dst = 'Saturday, November 6, 2021 at 1:50 PM'
time_st = 'Monday, November 8, 2021 at 1:50 PM'

time_dst = datetime.strptime(time_dst, '%A, %B %d, %Y at %I:%M %p')
time_dst = time_dst.replace(tzinfo=CDT)
time_st = datetime.strptime(time_st, '%A, %B %d, %Y at %I:%M %p')
time_st = time_st.replace(tzinfo=CDT)

print('DST: ', time_dst)
print('ST:  ', time_st)

ZoneInfo尽管使用了哪个对象,输出似乎是相同的:

DST:  2021-11-06 13:50:00-05:00
ST:   2021-11-08 13:50:00-06:00

推荐阅读