在python中添加年份

在python中添加年份,python,datetime,python-3.x,python-datetime,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() 你不能只加100*3

如果我想在我的程序中增加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()

你不能只加100*365天,因为闰年的时间跨度是366天。在你100年的时间里,你会错过25天

最好在此处使用以下选项:

在闰年的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)
演示:

要执行期间(日历)算法,可以使用:

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

print(date(2000, 2, 29) + relativedelta(years=+100))
2100-02-28
请注意,
2100
不是闰年,而
2000
是闰年

如果要添加的唯一单元是year,则可以仅使用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
男子300次

做过C的人都知道答案

mktime自动将溢出值添加到下一个较大的单位。您只需要将其转换回datetime

例如,您可以将2019-07-40转换为2019-08-09

>>> datetime.fromtimestamp(mktime((2019, 7, 40, 0, 0, 0, 0, 0, 0)))
datetime.datetime(2019, 8, 9, 0, 0)
或2019-03-(-1)转换为2019-02-27:

>>> datetime.fromtimestamp(mktime((2019, 3, -1, 0, 0, 0, 0, 0, 0)))
datetime.datetime(2019, 2, 27, 0, 0)
因此,你只需选择你的旧约会,然后添加你喜欢的内容:

now = datetime.datetime.now()
hundred_days_later = datetime.datetime.fromtimestamp(mktime((now.year, now.month, now.day + 100, now.hour, now.minute, now.second, 0, 0, 0)))

因为年并不都是365天,这不是打字错误。它是为了可读性(突出显示操作的标志)。
@jfs
你说得对。刚刚注意到+在哪一侧。对不起,我今天早上过得很慢。我将删除原始评论。@jfs您的前两个链接指向已删除的问题和付费网站。@EKHUMO我可以在这两个链接中看到信息。它们提供了背景信息——如果你看不到它们,就忽略它们(尽管我认为你应该能够看到它们)——答案可以在没有它们的情况下使用。乍一看,它看起来不像是链接重复句柄OP案例中的公认答案。@jfs只有10000个用户可以看到已删除的问题,而且付费网站也不是每个人都可以访问的。这个问题很明显是重复的,因为唯一的区别是年数。有几个答案,包含与您相同的解决方案。没有公认的答案。
>>> datetime.fromtimestamp(mktime((2019, 7, 40, 0, 0, 0, 0, 0, 0)))
datetime.datetime(2019, 8, 9, 0, 0)
>>> datetime.fromtimestamp(mktime((2019, 3, -1, 0, 0, 0, 0, 0, 0)))
datetime.datetime(2019, 2, 27, 0, 0)
now = datetime.datetime.now()
hundred_days_later = datetime.datetime.fromtimestamp(mktime((now.year, now.month, now.day + 100, now.hour, now.minute, now.second, 0, 0, 0)))