python
import argparse
from datetime import date, datetime
def berechne(geburtstag, heute):
jahre = heute.year - geburtstag.year
if (heute.month, heute.day) < (geburtstag.month, geburtstag.day):
jahre -= 1 # Geburtstag dieses Jahr noch nicht gewesen
naechster = geburtstag.replace(year=heute.year)
if naechster < heute:
naechster = naechster.replace(year=heute.year + 1)
return jahre, (naechster - heute).days
def main():
parser = argparse.ArgumentParser(description='Alter berechnen')
parser.add_argument('geburtsdatum', help='Format TT.MM.JJJJ')
args = parser.parse_args()
try:
geburtstag = datetime.strptime(args.geburtsdatum, '%d.%m.%Y').date()
except ValueError:
parser.error('Ungültiges Datum, erwartet TT.MM.JJJJ')
jahre, tage = berechne(geburtstag, date.today())
print(f'Alter: {jahre} Jahre, nächster Geburtstag in {tage} Tagen')
if __name__ == '__main__':
main()
Was passiert:
strptimewandelt den Text in eindatetime,.date()macht daraus ein reines Datum. Passt das Format nicht, löststrptimeeinenValueErroraus.parser.error(...)gibt dann eine Meldung samt Hilfe-Hinweis aus und beendet das Programm.- Der Vergleich der Tupel
(Monat, Tag)ist ein eleganter Weg zu prüfen, ob der Geburtstag dieses Jahr schon war: Tupel werden elementweise von links verglichen. geburtstag.replace(year=...)baut ein neues Datum mit anderem Jahr. Für den 29. Februar würde das in Nicht-Schaltjahren einen Fehler auslösen. Als Verbesserung kannst du diesen Sonderfall selbst abfangen.- Die Rechenlogik steht in der Funktion
berechne, die keininputund keinprintenthält. Dadurch lässt sie sich mit festen Testdaten prüfen, z. B.berechne(date(1990, 5, 17), date(2026, 10, 20)).
Warum so: Das Muster "Eingabe lesen, rechnen, ausgeben" in getrennten Funktionen ist die Grundlage für jedes spätere Skript, egal ob die Daten aus der Kommandozeile, einer Datenbank oder einer API kommen.