2010-02-12 14 views

Antwort

25

Natürlich gibt es nicht - wenn heute der 31. Januar, was wäre "der gleiche Tag des nächsten Monats" ?! Offensichtlich gibt es keine richtige Lösung, seit dem 31. Februar existiert nicht, und die datetime Modul tut nicht spielen bei "rate, was der Benutzer dieses unmögliche Problem aufwirft ohne eine richtige Lösung denkt (falsch) ist die offensichtliche Lösung"; -).

Ich schlage vor:

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 
+1

Danke Alex! Ich habe Datetime.AddMonths() in C# für diese Frage verwendet. Also habe ich nicht viel nachgedacht bevor ich die Frage gestellt habe :). Ich habe einen Test mit C# Datetime.AddMonths (1) für Jan (28-31), interessante Ergebnisse, ich habe 5 Feb 28. Danke nochmal Alex! – icn

82

Verwendung dateutil Modul. Es hat relative time deltas:

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

Schön.

+1

dateutil ist genial. Sollte Standard sein. – Max

+4

Wow es behandelt Jan 31 + 1 Monat. Es kehrte am letzten Tag des Feb. –

+0

zurück Dies sollte die akzeptierte Antwort sein. So viel einfacher ... – Someguy123

2
from calendar import mdays 
from datetime import datetime, timedelta 

today = datetime.now() 
next_month_of_today = today + timedelta(mdays[today.month]) 

Ich möchte Dateutil nicht importieren. Probieren Sie es aus. Viel Glück.

+1

installieren Ich wollte wirklich diese Lösung zu arbeiten, aber ein Jahr im 4. Februar wird mit mdays gebrochen werden ... – Zemogle

+0

mdays ist nicht einmal in der Dokumentation ausgesetzt, wahrscheinlich aus dem Grund, dass mdays nicht genau ist Schaltjahre. Die Funktion "Monatsbereich" ist genauer, da dies berücksichtigt wird. –

5
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]) 
+1

das ist falsch. 'next_month (datetime.date (2014,01,30)) == datetime.date (2014, 3, 2)' – fjsj

0
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

Dies ist, wie ich es gelöst.

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 

Sie können die try/catch überspringen, wenn Sie nur den ersten Tag im nächsten Monat wollen replace(year=date.today().year+year, month=month, day=1) indem. Dies ist immer ein gültiges Datum, da wir den Monatsüberlauf mit divmod abgefangen haben.

1

Diese Arbeit für mich

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 

Nutzung:

d = datetime.datetime.today() 
print next_month_date(d) 
Verwandte Themen