615 Stimmen

Wie berechne ich mit dem Python-Modul datetime das Datum sechs Monate vor dem aktuellen Datum?

Ich verwende das Python-Modul datetime. Ich möchte das Datum 6 Monate nach dem aktuellen Datum berechnen. Könnte mir jemand ein wenig Hilfe dabei geben?

Der Grund, warum ich ein Datum generieren möchte, das 6 Monate nach dem aktuellen Datum liegt, ist, dass ich eine Datum der Überprüfung . Wenn der Benutzer Daten in das System eingibt, haben diese ein Überprüfungsdatum von 6 Monaten ab dem Datum, an dem er sie eingegeben hat.

2voto

Nandlal Yadav Punkte 11

Allgemeine Funktion zur Ermittlung des nächsten Datums nach/vor x Monaten.

from datetime import date

def after\_month(given\_date, month):
    yyyy = int(((given\_date.year \* 12 + given\_date.month) + month)/12)
    mm = int(((given\_date.year \* 12 + given\_date.month) + month)%12)

    if mm == 0:
        yyyy -= 1
        mm = 12
    return given\_date.replace(year=yyyy, month=mm)

if \_\_name\_\_ == "\_\_main\_\_":
    today = date.today()
    print(today)

    for mm in \[-12, -1, 0, 1, 2, 12, 20 \]:
        next\_date = after\_month(today, mm)
        print(next\_date)

2voto

Robert Lujo Punkte 14020

Eine weitere Lösung - ich hoffe, sie gefällt jemandem:

def add_months(d, months):
    return d.replace(year=d.year+months//12).replace(month=(d.month+months)%12)

Diese Lösung funktioniert für die Tage 29, 30 und 31 nicht in allen Fällen, so dass eine robustere Lösung erforderlich ist (die nicht mehr so schön ist :) ):

def add_months(d, months):
    for i in range(4):
        day = d.day - i
        try:
            return d.replace(day=day).replace(year=d.year+int(months)//12).replace(month=(d.month+int(months))%12)
        except:
            pass
    raise Exception("should not happen")

2voto

perfecto25 Punkte 628

Ich melde mich spät zu Wort, aber

Sehen Sie sich das Maya-Modul von Ken Reitz an,

https://github.com/kennethreitz/maya

So etwas könnte Ihnen helfen, ändern Sie einfach Stunden=1 in Tage=1 oder Jahre=1

>>> from maya import MayaInterval

# Create an event that is one hour long, starting now.
>>> event_start = maya.now()
>>> event_end = event_start.add(hours=1)

>>> event = MayaInterval(start=event_start, end=event_end)

2voto

tony diep Punkte 19
import datetime

'''
Created on 2011-03-09

@author: tonydiep
'''

def add_business_months(start_date, months_to_add):
    """
    Add months in the way business people think of months. 
    Jan 31, 2011 + 1 month = Feb 28, 2011 to business people
    Method: Add the number of months, roll back the date until it becomes a valid date
    """
    # determine year
    years_change = months_to_add / 12

    # determine if there is carryover from adding months
    if (start_date.month + (months_to_add % 12) > 12 ):
        years_change = years_change + 1

    new_year = start_date.year + years_change

    # determine month
    work = months_to_add % 12
    if 0 == work:
        new_month = start_date.month
    else:
        new_month = (start_date.month + (work % 12)) % 12

    if 0 == new_month:
        new_month = 12 

    # determine day of the month
    new_day = start_date.day
    if(new_day in [31, 30, 29, 28]):
        #user means end of the month
        new_day = 31

    new_date = None
    while (None == new_date and 27 < new_day):
        try:
            new_date = start_date.replace(year=new_year, month=new_month, day=new_day)
        except:
            new_day = new_day - 1   #wind down until we get to a valid date

    return new_date

if __name__ == '__main__':
    #tests
    dates = [datetime.date(2011, 1, 31),
             datetime.date(2011, 2, 28),
             datetime.date(2011, 3, 28),
             datetime.date(2011, 4, 28),
             datetime.date(2011, 5, 28),
             datetime.date(2011, 6, 28),
             datetime.date(2011, 7, 28),
             datetime.date(2011, 8, 28),
             datetime.date(2011, 9, 28),
             datetime.date(2011, 10, 28),
             datetime.date(2011, 11, 28),
             datetime.date(2011, 12, 28),
             ]
    months = range(1, 24)
    for start_date in dates:
        for m in months:
            end_date = add_business_months(start_date, m)
            print("%s\t%s\t%s" %(start_date, end_date, m))

2voto

Breno Monteiro Punkte 71

Das "python-dateutil" (externe Erweiterung) ist eine gute Lösung, aber man kann es auch mit eingebauten Python-Modulen (datetime und datetime) machen

Ich habe einen kurzen und einfachen Code erstellt, um das Problem zu lösen (mit Jahr, Monat und Tag)

(läuft: Python 3.8.2)

from datetime import datetime
from calendar import monthrange

# Time to increase (in months)
inc = 12

# Returns mod of the division for 12 (months)
month = ((datetime.now().month + inc) % 12) or 1

# Increase the division by 12 (months), if necessary (+ 12 months increase)
year = datetime.now().year + int((month + inc) / 12)

# (IF YOU DON'T NEED DAYS,CAN REMOVE THE BELOW CODE)
# Returns the same day in new month, or the maximum day of new month
day = min(datetime.now().day,monthrange(year, month)[1])

print("Year: {}, Month: {}, Day: {}".format(year, month, day))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X