此解决方案在12月正确运行,而此页面上的大多数答案都无效。在使用模数(%)或整数除法(//)之前,您需要首先将月份从基数1(即Jan = 1)转换为基数0(即Jan = 0),否则11月(11)加1个月为您提供12 ,当找到余数(12%12)时得到0。
(也不要建议“((月%12)+ 1”或10月+1 = 12月!)
def AddMonths(d,x):
newmonth = ((( d.month - 1) + x ) % 12 ) + 1
newyear = int(d.year + ((( d.month - 1) + x ) / 12 ))
return datetime.date( newyear, newmonth, d.day)
但是...这不能解决1月31日+一个月之类的问题。因此,我们回到OP-您增加一个月意味着什么?一种解决方案是回溯到有效的一天,因为大多数人会假设jan的最后一天加上一个月等于2月的最后一天。这也适用于负数个月。证明:
>>> import datetime
>>> AddMonths(datetime.datetime(2010,8,25),1)
datetime.date(2010, 9, 25)
>>> AddMonths(datetime.datetime(2010,8,25),4)
datetime.date(2010, 12, 25)
>>> AddMonths(datetime.datetime(2010,8,25),5)
datetime.date(2011, 1, 25)
>>> AddMonths(datetime.datetime(2010,8,25),13)
datetime.date(2011, 9, 25)
>>> AddMonths(datetime.datetime(2010,8,25),24)
datetime.date(2012, 8, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-1)
datetime.date(2010, 7, 25)
>>> AddMonths(datetime.datetime(2010,8,25),0)
datetime.date(2010, 8, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-12)
datetime.date(2009, 8, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-8)
datetime.date(2009, 12, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-7)
datetime.date(2010, 1, 25)>>>