python - Python 中使用 timedelta 步进日期(以月为单位)

标签 python datetime

我的开始日期是datetime(2015, 01, 01)我希望我的程序每一步都前进到下个月的第一天,它将这样做几十年,但解决它只需要一年。原因是 while循环是因为我还希望它根据月份和年份进行一些废弃。这是我编写的代码:

import datetime

dayS = 01; monthS = 01; yearS = 2015 #Start date
dayE = 01; monthE = 01; yearE = 2016 #End date
SDate = datetime.date(yearS, monthS, dayS)
EDate = datetime.date(yearE, monthE, dayE)
Date = []

while SDate <= EDate:
        Date.append(SDate.strftime('%d/%m/%Y'))
        if SDate.strftime('%m') == '02':
                step = datetime.timedelta(days=28)
        if SDate.strftime('%m') == '09' or '04' or '06' or '11':
                step = datetime.timedelta(days=30)
        if SDate.strftime('%m') == '01' or '03' or '05' or '07' or '08' or '10' or '12':
                step = datetime.timedelta(days=31)
        SDate += step

print Date

但是我得到的结果是['01/01/2015', '01/02/2015', '04/03/2015', '04/04/2015', '05/05/2015', '05/06/2015', '06/07/2015', '06/08/2015', '06/09/2015', '07/10/2015', '07/11/2015', '08/12/2015'] ,正如您所看到的,有些月份它没有添加正确的天数。

非常感谢任何帮助!

最佳答案

你遇到的是经典的“或”问题。

"foo" == "1" or "2"

将始终返回True,因为它被解析为:

("foo" == "1") or "2"
         |         |
         False or "2"
               |
              "2"

请注意,在这种情况下,您最好使用 datetime.date.replace .

while SDate <= EDate:
    if SDate.month < 12:
        SDate = SDate.replace(month=SDate.month + 1)
    else:
        SDate = SDate.replace(month=1, year=SDate.year + 1)

关于python - Python 中使用 timedelta 步进日期(以月为单位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26185614/

相关文章:

python - Python 3.3 中的类声明

c++ - 最小线性回归程序

python - 如何在给定多个 'start' 和 'end' 日期时间对象的情况下查找间隙?

python - 如何将 Pandas 中的两位数年份整数转换为四位数字?

Python:在一个简单的字符串中获取最新的日期时间

python - 创建一个新列,该新列是满足两个条件的多个其他列中的日期数之和

python - 在 Python 中调整 OSX 系统音量

python - 从 Kubernetes api 打印日志

java - 为什么我不应该在 Java TimeZone 中使用缩写

c++ - 将 wxString 转换为 time_t