【问题标题】:ValueError: day is out of range for month pythonValueError:日期超出月份python的范围
【发布时间】:2026-01-05 06:00:01
【问题描述】:

我正在编写代码,让用户可以记下他们所拥有的事物的日期和时间。它包含开始日期、开始时间和结束时间。它还允许用户指定他们是否希望将其延续到多个星期(例如一个月的每个星期一) 我正在使用 for 循环来执行此操作,并且由于不同的月份有不同的日子,我显然希望(如果下周一是下个月)它有正确的日期。

这是我的代码:

for i in range(0 , times):
    day = day
    month = month
    fulldateadd = datetime.date(year, month, day)
    day = day + 7
    if month == ( '01' or '03' or '05' or '07' or '10'or '12'):
        if day > 31:
            print(day)
            day = day - 31
            print(day)
            month = month + 1
        elif month == ( '04' or '06'or '09' or '11'):
            if day > 30:
                print(day)
                day = day - 30
                print(day)
                month = month + 1
        elif month == '02':
            if day > 29:
                print(day)
                day = day - 29
                print(day)
                month = month + 1

在运行它并测试它是否正确进入新月份时,我收到错误:

  File "C:\Users\dansi\AppData\Local\Programs\Python\Python36-32\gui test 3.py", line 73, in addtimeslot
fulldateadd = datetime.date(year, month, day)
ValueError: day is out of range for month

我哪里出错了?

【问题讨论】:

  • 就像previous question 中的评论者一样,我建议您使用timedeltadatetime 对象添加时间。那么你就完全不用担心月份的界限了。
  • @glibdud 我对日期时间真的很陌生,因为在学校里我们并没有真正深入。我喜欢它的外观,但我不知道实现它的好方法。

标签: python-3.x datetime


【解决方案1】:

如果不查看之前的一些代码,很难完全准确(例如,daymonthyeartimes 来自哪里?),但您可能会这样做在您的代码中使用timedelta

fulldateadd = datetime.date(year, month, day)
for i in range(times):
    fulldateadd = fulldateadd + datetime.timedelta(7)

timedelta 实例表示一段时间,而不是特定的绝对时间。默认情况下,传递给构造函数的单个整数表示天数。所以timedelta(7) 给你一个代表 7 天的对象。

timedelta 实例随后可以与 datetimedate 实例一起使用,使用基本算术。例如,date(2016, 12, 31) + timedelta(1) 会为您提供date(2017, 1, 1),而您无需执行任何特殊操作。

【讨论】:

  • 完美的解释和答案。谢谢:)我知道这不是问的地方,但我可以问你是否可以帮助解决其他问题?