cómo obtener el mismo día del próximo mes de un día determinado en python usando datetime

Sé que usando datetime.timedelta puedo obtener la fecha de algunos días fuera de la fecha dada

daysafter = datetime.date.today() + datetime.timedelta(days=5) 

pero no parece datetime.timedelta(month=1)

Por supuesto que no hay, si el 31 de enero de hoy, ¡¿qué sería “el mismo día del próximo mes”? Obviamente, no hay una solución correcta , ya que el 31 de febrero no existe, y el módulo datetime no juega a “adivinar lo que el usuario plantea este problema imposible sin que una solución correcta piense (erróneamente) que es la solución obvia” ;-).

Yo sugiero:

 try: nextmonthdate = x.replace(month=x.month+1) except ValueError: if x.month == 12: nextmonthdate = x.replace(year=x.year+1, month=1) else: # next month is too short to have "same date" # pick your own heuristic, or re-raise the exception: raise 

Utilice el módulo dateutil . Tiene deltas de tiempo relativos :

 import datetime from dateutil import relativedelta nextmonth = datetime.date.today() + relativedelta.relativedelta(months=1) 

Hermoso.

 import calendar, datetime def next_month ( date ): """return a date one month in advance of 'date'. If the next month has fewer days then the current date's month, this will return an early date in the following month.""" return date + datetime.timedelta(days=calendar.monthrange(date.year,date.month)[1]) 
 from calendar import mdays from datetime import datetime, timedelta today = datetime.now() next_month_of_today = today + timedelta(mdays[today.month]) 

No quiero importar dateutil. Prueba esto. Buena suerte.

Este trabajo para mi

 import datetime import calendar def next_month_date(d): _year = d.year+(d.month//12) _month = 1 if (d.month//12) else d.month + 1 next_month_len = calendar.monthrange(_year,_month)[1] next_month = d if d.day > next_month_len: next_month = next_month.replace(day=next_month_len) next_month = next_month.replace(year=_year, month=_month) return next_month 

uso:

 d = datetime.datetime.today() print next_month_date(d) 
 from datetime import timedelta try: next_month = (x.replace(day=28) + timedelta(days=7)).replace(day=x.day) except ValueError: # assuming January 31 should return last day of February. next_month = (x + timedelta(days=31)).replace(day=1) - timedelta(days=1) 

Así lo resolví.

 from datetime import date try: (year, month) = divmod(date.today().month, 12) next_month = date.today().replace(year=date.today().year+year, month=month+1) except ValueError: # This day does not exist in next month 

Puede omitir el try / catch si solo desea el primer día del próximo mes configurando replace(year=date.today().year+year, month=month, day=1) . Esta será siempre una fecha válida, ya que hemos capturado el desbordamiento del mes usando divmod .

Al observar qué mes es en 32 días, puede determinar si este es el último día del mes y si la fecha existe en el próximo mes. Esto se debe a que al menos uno de los dos meses consecutivos contiene 31 días.

 from datetime import date, timedelta def in_a_month(d): in_32_days = d + timedelta(32) if (in_32_days.month - d.month) % 12 > 1: return in_32_days - timedelta(in_32_days.day) else: return date(in_32_days.year, in_32_days.month, d.day) 

O si necesita una solución para agregar o eliminar meses arbitrarios

 from datetime import date, timedelta def last_day_in_month(a_date, months_forward = 0): month_index = a_date.year * 12 + a_date.month + months_forward y = month_index // 12 m = (month_index % 12) + 1 return date(y, m, 1) - timedelta(1) def add_month(a_date, months = 1): is_last_day = a_date == last_day_in_month(a_date) last_in_target_month = last_day_in_month(a_date, months) if is_last_day or a_date.day > last_in_target_month.day: return last_in_target_month else: return last_in_target_month.replace(day = a_date.day)