Python datetime为何拒绝解析无年份的2月29日?
问题:datetime.strptime解析无年份的2月29日报错是否符合设计逻辑?
问题场景
在Windows 11系统上使用Python 3.11执行以下代码时出现报错:
d = 'Mon 29 Feb' import datetime datetime.datetime.strptime(d, '%a %d %b')
报错信息如下:
Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> datetime.datetime.strptime(d, '%a %d %b') File "C:\Users\pskipwith\AppData\Local\Programs\Python\Python311\Lib\_strptime.py", line 579, in _strptime_datetime return cls(*args) ValueError: day is out of range for month
但添加年份(如2016)后即可正常执行:
d = 'Mon 29 Feb 2016' datetime.datetime.strptime(d, '%a %d %b %Y') # 输出结果:datetime.datetime(2016, 2, 29, 0, 0)
回答:这是符合Python datetime模块的设计逻辑的
原因说明
- 当
strptime解析不含年份的日期时,会默认填充1900年作为年份值,这是模块的既定行为。 - 1900年是平年,2月份仅有28天,所以29日属于无效日期,触发
ValueError是合理的。 - 当明确指定闰年(比如2016年)时,2月有29天,日期合法,因此解析可以正常完成。
内容的提问来源于stack exchange,提问作者PMSK
相关产品推荐
相关产品推荐

