Если вы ищете точные или «более точные» даты, вам, вероятно, лучше проверить dateutil .
Быстрый пример:
>>> from dateutil.relativedelta import relativedelta
>>> import datetime
>>> TODAY = datetime.date.today()
>>> TODAY
datetime.date(2012, 3, 6)
Теперь добавьте 3 месяца к TODAY
, обратите внимание, что он точно соответствует дню (обратите внимание, что relativedelta(months=3)
и relativedelta(month=3)
ведут себя по-разному. Обязательно используйте months
для этих примеров!).
>>> three_mon_rel = relativedelta(months=3)
>>> TODAY + three_mon_rel
datetime.date(2012, 6, 6)
И он остается неизменным в течение года. Буквально каждые три месяца, в день (пришлось продолжать добавлять, потому что по какой-то причине умножение relativedelta
и добавление его к объекту datetime.date
приводит к TypeError
):
>>> TODAY + three_mon_rel + three_mon_rel
datetime.date(2012, 9, 6)
>>> TODAY + three_mon_rel + three_mon_rel + three_mon_rel
datetime.date(2012, 12, 6)
>>> TODAY + three_mon_rel + three_mon_rel + three_mon_rel + three_mon_rel
datetime.date(2013, 3, 6)
Принимая во внимание, что предлагаемое решение мВч , хотя и определенно «достаточно хорошее», с течением времени слегка дрейфует:
>>> three_mon_timedelta = datetime.timedelta(days=3 * 365/12)
>>> TODAY + three_mon_timedelta
datetime.date(2012, 6, 5)
И в течение года день месяца продолжает скользить:
>>> TODAY + three_mon_timedelta * 2
datetime.date(2012, 9, 4)
>>> TODAY + three_mon_timedelta * 3
datetime.date(2012, 12, 4)
>>> TODAY + three_mon_timedelta * 4
datetime.date(2013, 3, 5)