from - strftime python
cómo obtener el mismo día del próximo mes de un día determinado en python usando datetime (8)
Sé usar datetime.timedelta puedo obtener la fecha de algunos días de la fecha dada
daysafter = datetime.date.today() + datetime.timedelta(days=5)
pero parece que no hay datetime.timedelta(month=1)
Al ver qué mes es en 32 días, puede averiguar si este es el último día del mes y si la fecha existe el mes próximo. 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 una cantidad arbitraria de meses
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)
Así es como 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 mes próximo configurando replace(year=date.today().year+year, month=month, day=1)
. Esta siempre será una fecha válida ya que hemos atrapado el desbordamiento del mes usando divmod
.
Este trabajo para mí
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)
Por supuesto que no; si el día de hoy es el 31 de enero, ¿cuál 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 de datetime
y datetime
no funciona para "adivinar qué es lo que plantea el usuario al plantear este problema imposible sin una solución correcta (erróneamente)" ;-).
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
Use el módulo dateutil
. Tiene deltas de tiempo relativos :
import datetime
from dateutil import relativedelta
nextmonth = datetime.date.today() + relativedelta.relativedelta(months=1)
Hermosa.
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.
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)
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])