je sais qu'en utilisant datetime.timedelta je peux obtenir la date de quelques jours d'absence du formulaire
daysafter = datetime.date.today() + datetime.timedelta(days=5)
mais semble pas datetime.timedelta(month=1)
Bien sûr, il n'y en a pas - si le 31 janvier est aujourd'hui, que serait "le même jour du mois prochain"?! Évidemment, il n’existe pas de solution right, car le 31 février n’existe pas et le module datetime
permet pas joue à "deviner ce que l’utilisateur posant ce problème impossible sans une solution correcte pense (à tort) est une évidence. Solution";-).
Je suggère:
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
Utilisez dateutil
module. Il a deltas de temps relatif :
import datetime
from dateutil import relativedelta
nextmonth = datetime.date.today() + relativedelta.relativedelta(months=1)
Belle.
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])
Je ne veux pas importer dateutil. Essayez ceci. Bonne chance.
Ce travail pour moi
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
usage:
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)
En regardant quel mois il est dans 32 jours, vous pouvez déterminer si c'est le dernier jour du mois et si la date existe le mois prochain. En effet, au moins un des deux mois consécutifs contient 31 jours
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)
Ou si vous avez besoin d'une solution pour ajouter ou supprimer un nombre arbitraire de mois
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)
Voici comment je l'ai résolu.
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
Vous pouvez passer l'essai/attraper si vous voulez seulement le premier jour du mois prochain en définissant replace(year=date.today().year+year, month=month, day=1)
. Ce sera toujours une date valide car nous avons détecté le dépassement de mois en utilisant divmod
.