python - 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 和时区的任何想法?
解决方案
不确定最好的方法,但从 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 很好地说明了CST6EDT
和US/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
推荐阅读
- angular - Angular-如何在出现 401 错误时关闭快餐栏?
- python - 当我想说不止一件事时,如何在 Python 的 Turtle 图形中使用 textinput()?
- microsoft-graph-api - 如何从 OWA 获取各种日期和时间格式列表?
- sql - JPA 本机查询日期比较抛出
- javascript - React js - 使用 Bootstrap4 CDN,如何在反应中手动启用 javascript 事件处理程序?
- android - 如何为三星标签 E 设置相机预览大小
- html - 隐藏父类并在父类中显示一个类
- apache-kafka - 如何限制 Kafka 客户端只能访问一位客户的数据?
- c# - 断点不会在 VSCode 中命中
- php - 替换字符串中的文本排除锚文本