Diese Lösung funktioniert korrekt für Dezember, was bei den meisten Antworten auf dieser Seite nicht der Fall ist. Sie müssen zuerst die Monate von der Basis 1 (d.h. Jan = 1) zur Basis 0 (d.h. Jan = 0) verschieben, bevor Sie den Modulus ( % ) oder die ganzzahlige Division ( // ) verwenden, sonst ergibt November (11) plus 1 Monat 12, was bei der Ermittlung des Rests ( 12 % 12 ) 0 ergibt.
(Und schlagen Sie nicht "(Monat % 12) + 1" oder Okt + 1 = Dezember vor!)
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)
Allerdings ... Dies berücksichtigt nicht das Problem des 31. Januar + einen Monat. Also zurück zum OP - was meinen Sie mit dem Hinzufügen eines Monats? Eine Lösung besteht darin, so lange zurückzurechnen, bis ein gültiger Tag erreicht ist, denn die meisten Menschen würden davon ausgehen, dass der letzte Tag des Januars plus ein Monat gleich dem letzten Tag des Februars ist. Dies funktioniert auch bei einer negativen Anzahl von Monaten. Der Beweis:
>>> 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)>>>