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

在 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 许可协议


回答:

您不能只添加 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 许可协议

以上是 在 python 中添加 100 年,为什么它显示错误的日期? 的全部内容, 来源链接: utcz.com/p/938669.html

回到顶部