在 python 中添加 100 年,为什么它显示错误的日期?
如果我想在我的程序中添加 100 年,为什么它显示错误的日期?
import datetimestringDate= "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 = 100try:
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 pythonfrom 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 isleapdef 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 dateprint(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