在 python 中添加 100 年,为什么它显示错误的日期?

如果我想在我的程序中添加 100 年,为什么它显示错误的日期?

 import datetime
stringDate= "January 10, 1920"
dateObject= datetime.datetime.strptime(stringDate, "%B %d, %Y")
endDate= dateObject+datetime.timedelta(days=100*365)
print dateObject.date()
print endDate.date()
原文由 ismail khan 发布,翻译遵循 CC BY-SA 4.0 许可协议
阅读 735
2 个回答

您不能只添加 100 * 365 天,因为在该时间跨度中有 366 天的闰年。在你的 100 年跨度中,你错过了 25 天。

最好在这里使用 datetime.replace() 方法

 endDate = dateObject.replace(year=dateObject.year + 100)

对于闰年的 2 月 29 日,这仍然会失败,因为根据您添加的年数,您最终会得到一个无效日期。在这种情况下,您可以回到 2 月 28 日,或者使用 3 月 31 日;处理抛出的异常并切换到您选择的替代品:

 years = 100
try:
    endDate = dateObject.replace(year=dateObject.year + years)
except ValueError::
    # Leap day in a leap year, move date to February 28th
    endDate = dateObject.replace(year=dateObject.year + years, day=28)

演示:

 >>> import datetime
>>> dateObject = datetime.datetime(1920, 1, 10, 0, 0)
>>> dateObject.replace(year=dateObject.year + 100)
datetime.datetime(2020, 1, 10, 0, 0)

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 3.0 许可协议

一年的秒数不固定你知道一年有多少天吗?再想想。

要执行周期(日历)算术,您可以使用 dateutil.relativedelta

 #!/usr/bin/env python
from datetime import date
from dateutil.relativedelta import relativedelta # $ pip install python-dateutil

print(date(1920, 1, 10) + relativedelta(years=+100))
# -> 2020-01-10

要理解为什么 d.replace(year=d.year + 100) 失败,请考虑:

 print(date(2000, 2, 29) + relativedelta(years=+100))
2100-02-28

请注意 2100 不是闰年,而 2000 是闰年。

如果您要添加的唯一单位是年,那么您可以仅使用 stdlib 来实现它:

 from calendar import isleap

def add_years(d, years):
    new_year = d.year + years
    try:
        return d.replace(year=new_year)
    except ValueError:
        if (d.month == 2 and d.day == 29 and # leap day
            isleap(d.year) and not isleap(new_year)):
            return d.replace(year=new_year, day=28)
        raise

例子:

 from datetime import date

print(add_years(date(1920, 1, 10), 100))
# -> 2020-01-10
print(add_years(date(2000, 2, 29), 100))
# -> 2100-02-28
print(add_years(date(2000, 2, 29), 4))
# -> 2004-02-29

原文由 jfs 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题