在python中添加年份

ism*_*han 8 python datetime python-3.x python-datetime

如果我想在我的程序中添加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()
Run Code Online (Sandbox Code Playgroud)

jfs*_*jfs 12

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

要执行句点(日历)算术,您可以使用 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
Run Code Online (Sandbox Code Playgroud)

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

print(date(2000, 2, 29) + relativedelta(years=+100))
2100-02-28
Run Code Online (Sandbox Code Playgroud)

请注意,这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
Run Code Online (Sandbox Code Playgroud)

例:

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
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 10

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

最好只使用这里的datetime.replace()方法:

endDate = dateObject.replace(year=dateObject.year + 100)
Run Code Online (Sandbox Code Playgroud)

这可能在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)
Run Code Online (Sandbox Code Playgroud)

演示:

>>> import datetime
>>> dateObject = datetime.datetime(1920, 1, 10, 0, 0)
>>> dateObject.replace(year=dateObject.year + 100)
datetime.datetime(2020, 1, 10, 0, 0)
Run Code Online (Sandbox Code Playgroud)