Python strptime忽略%A格式符 如何正确解析星期生成datetime对象
问题根因
- strptime 中的
%A/%a仅用于匹配输入字符串中的星期文本,不会作为独立字段写入 datetime 对象 - datetime 的星期是完全由年月日时分秒派生计算的属性,不是独立存储的字段
- 解析时缺失的年月日会默认填充为
1900-01-01,该日期恰好是星期一,因此无论输入的是 Monday 还是 Tuesday,解析结果都为周一,看起来就像%A被忽略了
解决方法(纯标准库实现)
思路:先拆分输入的星期和时间,单独解析时间,再通过日期偏移调整基准日期,让最终datetime的星期和输入匹配。
完整实现代码:
import datetime # 星期全称映射到datetime.weekday()返回值(周一为0,周日为6) WEEKDAY_MAP = { "Monday": 0, "Tuesday": 1, "Wednesday": 2, "Thursday": 3, "Friday": 4, "Saturday": 5, "Sunday": 6 } def parse_week_time(input_str: str) -> datetime.datetime: # 拆分输入为星期、时间两部分 week_part, time_part = input_str.split(maxsplit=1) # 大小写兼容处理 week_part = week_part.title() # 解析时间部分,拿到默认基准日期的时分信息 base_dt = datetime.datetime.strptime(time_part, "%I:%M%p") # 计算需要偏移的天数,让最终星期匹配输入 target_weekday = WEEKDAY_MAP[week_part] delta = target_weekday - base_dt.weekday() return base_dt + datetime.timedelta(days=delta)
验证效果
# 测试输入 a = "Monday 11:30am" b = "tuesday 11:30pm" # 测试小写输入 dt_a = parse_week_time(a) dt_b = parse_week_time(b) print(dt_a) # 输出 1900-01-01 11:30:00,weekday()为0(周一) print(dt_b) # 输出 1900-01-02 23:30:00,weekday()为1(周二)
最终生成的datetime的星期完全和输入一致,年月日不影响使用,符合需求。
内容的提问来源于stack exchange,提问作者Him
相关产品推荐
相关产品推荐

