获取次日(元旦)时间戳失败:日期超出当月范围
问题原因
- 这个错误并非仅在新年前夜出现,每个月的最后一天执行都会触发。比如1月31日时,
today.day +1会得到32,而1月最多只有31天,直接将这个值传入datetime构造器就会抛出ValueError: day is out of range for month。同理,4月30日、6月30日等所有月末日期都会出现同样问题。
解决方法
不要手动给日期的day字段加1,改用datetime.timedelta来计算次日,它会自动处理月份、年份的进位逻辑,同时要注意保持时区的一致性:
修改后的代码:
from datetime import datetime, timedelta from pytz import timezone study_timezone = timezone('Europe/London') # 直接获取带时区的当前时间,替代localize方式 today = datetime.now(study_timezone) print("today:", today) # 先将当前时间转为当日0点,再加1天得到次日0点 tomorrow = today.replace(hour=0, minute=0, second=0, microsecond=0) + timedelta(days=1) # 转换为时间戳输出 print("Timestamp_Tomorrow: ", int(tomorrow.timestamp()))
关键说明
- 使用
datetime.now(study_timezone)是获取带时区时间的更稳妥方式,比localize更简洁,还能避免naive时间(无时区信息的datetime对象)引发的潜在问题。 timedelta(days=1)会自动处理日期进位:比如12月31日加1天会自动变为次年1月1日,31日加1天会自动切换到下月初,彻底规避日期越界的报错。
内容的提问来源于stack exchange,提问作者Peter_Brown_USA
相关产品推荐
相关产品推荐

