web-dev-qa-db-fra.com

comment obtenir le même jour du mois prochain d'un jour donné en python avec datetime

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)

36
icn

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
28
Alex Martelli

Utilisez dateutil module. Il a deltas de temps relatif :

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

Belle.

112
nosklo
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])
6
Ch'marr
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.

3
zerone

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)
1
Daoctor
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)
0
Collin Anderson

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)
0
Jolbas

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.

0
Hans Kristian