#! /usr/bin/env python # Usage: # python pycalendar.py # import sys def wochentag(d:int, m:int, y:int) -> int: """ bereche den Wochentag eines Datum Die Wochentage werden wie folgt codiert: So | Mo | Di | Mi | Do | Fr | Sa 0 | 1 | 2 | 3 | 4 | 5 | 6 @param d: Der Tag im Monat fängt mit 0 an @param m: Der Monat 1 = Januar, 2 = Februa, ... 12 = Dezember @param y: Die Jahresnummer in 4 Ziffer @return den Wochentag als eine ganze Zahl """ y0 = y - (14 - m) // 12 x = y0 + y0//4 - y0//100 + y0//400 m0 = m + 12*( (14-m)//12 ) - 2 return (d + x + (31*m0)//12) % 7 def berechne_ueberhang_tage(wochentag:int) -> int: """Nach Gepflogenheit in deutches Kalender-System fängt eine Woche mit Montag an. Mo -> Keinen Überhang; Di -> 1 Überhang; Mi -> 2 Überhange; Do -> 3 Überhange; Fr -> 4 Überhange; Sa -> 5 Überhange; So -> 6 Überhange """ return (wochentag - 1) % 7 def ist_schaltjahr(y:int) -> bool: """Ein Jahr ist ein Schaltjahr, wenn es * durch 4 teilbar ist, * und nicht durch 100 teilbar, * aber durch 400 teilbar ist. """ return (y % 4 == 0) and ( (y%100 != 0) or (y%400 == 0) ) def letzter_tag(m: int, y:int) -> int: """Berechne den letztenn Tag eines Monat in einem Jahr """ tage = [None, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] if m != 2: return tage[m] return 29 if ist_schaltjahr(y) else 28 def print_kalender(m: int, y: int): monaten = [None, "Januar", "Februar", "März", "April", "Mai", "Juni", "July", "August", "September", "Oktober", "November", "Dezember"] # Ausgabe des Monat und Jahr print(f"{monaten[m]} {y}") wochentage = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"] print(" ".join(wochentage)) # Ausgabe der Überhang von letzen Monat erster_wochentag = wochentag(1, m, y) ueberhang = berechne_ueberhang_tage(erster_wochentag) spalten_breite = len(wochentage[0]) + 1 ueberhang_zeichen = " "*(spalten_breite * ueberhang) print(ueberhang_zeichen, end="") # Ausgabe des Kalenders spalten_idx = ueberhang tag = 1 letzter_tag_im_monat = letzter_tag(m, y) while tag <= letzter_tag_im_monat: print(f"{tag:2d}", end=" ") tag += 1 spalten_idx += 1 if spalten_idx % 7 == 0: print() m, y = int(sys.argv[1]), int(sys.argv[2]) print_kalender(m, y) print()