python 现在日期减去一个月,解决报错 (ValueError: day is out of range for month)

文章介绍了如何在Python中使用`datetime`和`dateutil.relativedelta`正确处理日期,避免`ValueError`,并通过例子展示从2023-10-31减去一个月至20230930的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:系统日期(现在日期)减去一个月,并且转换格式(xxxx-xx-xx -> xxxxxxxx)

例如:由(2023-09-30)这种时间格式 转换为 (20230930)这种字符串格式

初始写法:

import datetime

today = datetime.date.today()
last_month = today.replace(month=today.month - 1).strftime("%Y%m%d")
print(last_month) 

但是在后来测试的时候,发现了问题,报如下错误:

Traceback (most recent call last):
  File "d:\test\python\python_learning\11.项目相关练习\14.减一月,日不在范围内.py", line 6, in <module>
    last_month = today.replace(month=today.month - 1).strftime("%Y%m%d")
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: day is out of range for month

测试时间是10月31日,减去一个月是9月31,然而9月是没有31日的,所有就有了如上报错。

解决:

经过调查,发现python自带一个库

dateutil.relativedelta

import datetime
from dateutil.relativedelta import relativedelta

last_month = datetime.date.today() - relativedelta(months=+1)
print(datetime.date.today(), type(datetime.date.today()))
print(last_month.strftime("%Y%m%d"), type(last_month.strftime("%Y%m%d")))

输出结果:
2023-10-31 <class ‘datetime.date’>
20230930 <class ‘str’>

9月没有31日就自动转换成9月的最后一天, 9月30日
也测试了3月31日减去一个月,输出结果为2月28(2023年)

这个错误信息 “ParserError: day is out of range for month: 2015/2/30 18:49:15” 表明你试图解析一个日期字符串,但该日期在指定的月份中是不存在的。具体来说,2015年2月没有30天。 在Python中处理这个错误有几种方法: 1. **验证日期的有效性**: 在解析日期之前,先验证日期的有效性。你可以使用`datetime`模块中的`datetime.strptime`方法来进行验证。 ```python from datetime import datetime date_string = "2015/2/30 18:49:15" try: # 尝试解析日期字符串 date_obj = datetime.strptime(date_string, "%Y/%m/%d %H:%M:%S") print("日期解析成功:", date_obj) except ValueError as e: print("日期解析失败:", e) ``` 2. **处理无效日期**: 如果你无法预先验证日期的有效性,可以在捕获到`ValueValue`异常后进行处理。 ```python from datetime import datetime date_string = "2015/2/30 18:49:15" try: date_obj = datetime.strptime(date_string, "%Y/%m/%d %H:%M:%S") except ValueError as e: # 处理无效日期 print("无效日期:", date_string) # 可以选择设置一个默认日期或其他逻辑 date_obj = None print("解析后的日期:", date_obj) ``` 3. **使用`dateutil`库**: `dateutil`库提供了更强大的日期解析功能,可以自动处理一些无效的日期格式。 ```python from dateutil import parser date_string = "2015/2/30 18:49:15" try: date_obj = parser.parse(date_string) print("日期解析成功:", date_obj) except ValueError as e: print("日期解析失败:", e) ``` 4. **修复日期**: 如果你确定日期格式是正确的,但日期本身有问题,可以在解析后修复日期。 ```python from datetime import datetime date_string = "2015/2/30 18:49:15" try: date_obj = datetime.strptime(date_string, "%Y/%m/%d %H:%M:%S") # 修复日期 next_day = date_obj.replace(day=1) + timedelta(days=32) date_obj = next_day.replace(day=date_obj.day) print("修复后的日期:", date_obj) except ValueError as e: print("日期解析失败:", e) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值