Über 4 einfache Befehle können Zeitpunkte in Minuten, Stunden, Tages, Wochen oder Monatsschritten gesetzt werden.
Jetzt() gibt entweder ein datetime-, date- oder time-Objekt zurück.
Zeitpunkt() gibt einen in der Zukunft oder Vergangenheit liegenden Zeitpunkt zrück.
nächstesMonEnde() gibt den letzten Tag des folgenden Monats zurück
nurWerktag() setzt das Datum auf einen Freitag, sollte ein Sams- oder Sonntag übergeben werden.
Die nurWerktag() Funktion ist aus der nächstetsMonEnde() entstanden da bestimmte Aufgaben am letzten Werktag des Monats erledigt werden müssen.
Alles in allem ist das kein Hexenwerk aber vielleicht für den Einen oder Anderen hilfreich oder ein Lösungsansatz.
Code: Alles auswählen
import datetime
""" infos zu datetime:
https://docs.python.org/3.2/library/datetime.html#date-objects
"""
def Jetzt(rückgabe = "x"):
if rückgabe.upper() in "DATUM":
c_datum = datetime.date.today()
elif rückgabe.upper() in "ZEIT":
c_datum = datetime.datetime.now().time()
elif rückgabe == "x":
c_datum = datetime.datetime.now()
else:
hw = "Jetzt() kann mit einem optionalen Parameter aufgerufen wer"
hw += "den. Ohne Parameter wird ein DateTime Objekt zurückgegebe"
hw += "n, bei 'D' ein Date Objekt und bei 'Z' ein Time Objekt"
print(hw)
return
return c_datum
def Zeitpunkt(c_datum,*x):
if type(c_datum) not in [datetime.datetime,datetime.date]:
hw = "Das Datum muß als datetime-Objekt übergeben werden, welches"
hw += " über die Funktion Jetzt() erstellt werden kann"
print(hw)
return
if len(x) == 0:
hw = "Fkt. Aufruf mit mind. einem zweiten Parameter, welcher di"
hw += "e Zeitspanne für die neue Zeit definiert. Möglich sind:"
hw += "'monat=x', 'woche=x', 'tag=x', 'stunde=x', 'minute=x'."
print(hw)
return
def Monatswechsel(c_dat,n_wert):
n_ja,n_mo,n_ta = c_dat.year,c_dat.month,c_dat.day
zahl = int(n_wert/abs(n_wert))
n_wert = abs(n_wert)
while n_wert > 0:
n_mo += zahl
if n_mo == 13 or n_mo == 0:
n_ja += zahl
n_mo = 1 if zahl > 0 else 12
n_wert -= 1
if n_ta > 28 and 1 < n_mo < 12:
tmp_tg = (datetime.date(n_ja,n_mo+1,1
)-datetime.timedelta(days=1)).day
n_ta = tmp_tg if tmp_tg < n_ta else n_ta
if type(c_dat) == datetime.datetime:
n_hr,n_mi,n_sk = c_dat.hour,c_dat.minute,c_dat.second
c_dat = datetime.datetime(n_ja,n_mo,n_ta,n_hr,n_mi,n_sk)
else:
c_dat = datetime.date(n_ja,n_mo,n_ta)
return c_dat
for part in x:
part = part.replace(" ","")
n_wert = int(part[part.find("=")+1:])
if "monat" in part:
c_datum = Monatswechsel(c_datum,n_wert)
elif "woche" in part:
c_datum = c_datum+datetime.timedelta(weeks=n_wert)
elif "tag" in part:
c_datum = c_datum+datetime.timedelta(days=n_wert)
elif "stunde" in part:
c_datum = c_datum+datetime.timedelta(hours=n_wert)
elif "minute" in part:
c_datum = c_datum+datetime.timedelta(minutes=n_wert)
else:
hw = "unbekannter Parameter. Mögliche Parameter sind\n"
hw += "'monat=x', 'tag=x', 'stunde=x', 'minute=x'"
print(hw)
return c_datum
def nächstesMonEnde(c_datum):
if type(c_datum) not in [datetime.datetime,datetime.date]:
hw ="das Datum muß als datetime.datetime Objekt oder datet"
hw +="ime.date Objekt übergeben werden!"
print(hw)
return
n_mo = c_datum.month+2
n_ja = c_datum.year
if n_mo == 13:
n_mo = 1
n_ja += 1
elif n_mo == 14:
n_mo = 2
n_ja += 1
if type(c_datum) == datetime.datetime:
n_hr,n_mi,n_sk = c_datum.hour,c_datum.minute,c_datum.second
c_datum = datetime.datetime(n_ja,n_mo,1,n_hr,n_mi,n_sk
)-datetime.timedelta(days=1)
else:
c_datum = datetime.date(n_ja,n_mo,1
)-datetime.timedelta(days=1)
return c_datum
def nurWerktag(c_datum):
if type(c_datum) not in [datetime.datetime,datetime.date]:
hw ="das Datum muß als datetime.datetime Objekt oder datet"
hw +="ime.date Objekt übergeben werden!"
print(hw)
return
if c_datum.isoweekday() > 5:
tage = c_datum.isoweekday() -7 + 2
c_datum = c_datum-datetime.timedelta(days=tage)
return c_datum
if __name__ == "__main__":
# Datum und Zeit von heute als datetime-Obj:
print("Datum + Zeit:",Jetzt())
# nur Datum als Obj:
print("nur Datum:",Jetzt("Datum"))
# nur Zeit als Obj:
print("nur Zeit:",Jetzt("Zeit"))
d1 = Jetzt()
print("nächstes Monatsende:",nächstesMonEnde(d1))
print("nur Werktage: ",nurWerktag(nächstesMonEnde(d1)))
print("Zeitpunkt +3Monate: ",Zeitpunkt(d1,"monat=3"))
print("Zeitpunkt -4Monate: ",Zeitpunkt(d1,"monat=-4"))
print("Zeitpunkt -3Wochen: ",Zeitpunkt(d1,"wochen=-3"))