Gregorianischer kalender des tages

Heute mal wieder eine 1a-inschenörsleistung aus der BRD der jetztzeit:

Am Düsseldorfer Flughafen sind am Montag etwa 1200 Koffer liegengebleiben. Der Grund: Die Software der Gepäck-Förderanlage hatte sich vom Schalttag aus dem Takt bringen lassen. „Die Anlage hat den 29. Februar nicht als Tag erkannt“, sagte ein Flughafensprecher

Wenn ihr so etwas lest, freut ihr euch bestimmt auch alle schon auf die „selbstfahrenden“ autos, deren softwäjhr vielleicht auch mal wegen einer zu hastig programmierten datumsaritmetik abkackt. Wie man sieht, bedeutet die existenz von gut getestetem und praktisch fehlerfreiem bibliotekskohd für praktisch jede ernsthaft verwendete programmiersprache keineswegs, dass programmierer den fertigen und fehlerfreien kohd auch benutzen. Da müsste man ja eine API-dokumentazjon lesen. Nee, viel zu mühsam, da schreibt mans lieber selbst, und zwar falsch.

Aber es gibt ja grund zur hoffnung:

„Wir hoffen, dass wir das in vier Jahren besser machen“, sagte der Sprecher

Softwäjhrtests mit gut ausgedachten testfällen wären übrigens eine tragfähige alternative zur hoffnung. Wenn man daran denkt, kann man das sogar automatisieren. Ach, das kostet zeit für den entwurf und die implementazjon und damit geld? Na, dann wird eben weitergehofft! Und wenns ganz hart kommt, holt man eben jemanden, der sich mit hoffnung richtig gut auskennt! So gehts in die zukunft. Und unterdessen darf von den menschen in der BRD gehofft werden, dass an entscheideneren stellen weniger gehofft und mehr geplant wird.

So einfach ist es nicht…

Ja, es stimmt, unser kalender unterliegt gewissen zyklischen abhängigkeiten, aber ganz so einfach ist es denn doch nicht. Manchmal möchte man im kalender ja auch die festtage ablesen können, und die sind im kristlichen kulturkreis ein bisschen komplizierter als das gewöhnliche spiel mit sonne, mond und wochentagen.

Alle beweglichen feste hängen vom osterdatum ab. Und das osterdatum haben sich ein paar komische käuze im vatikan folgermaßen ausgedacht: es ist der erste sonntag (das ist leicht) nach dem ersten vollmond (nein, nicht mehr ganz so leicht, denn jetzt kommt noch eine kleine erschwerung hinzu) nach dem frühlingsanfang. Frühlingsanfang ist übrigens, wenn die sonne senkrecht übern äkwator steht, dies ist ein wert, der ebenfalls ein bisschen schwanken kann.

Vor einiger zeit war ich einmal mit diesem mist konfrontiert (manchmal watet man eben durch die scheiße, weil man einfache probleme lösen will), konnte beim programmieren nicht ganz so beliebig biblioteken benutzen, wie ich das für mich selbst täte und fand mich darin wieder, die osterformel von Gauß in einer gräußlichen programmiersprache, nämlich in scheme, zu kohden:

; Osterformel
; Gibt für ein Jahr das Datum in Bezug auf den Monat März zurück, dieses
; kann auch über 31 liegen
(define easter-march-date
  (lambda (year)
    (let* 
      ((intdiv (lambda (n m) (floor (/ n m))))
       (k (intdiv year 100))
       (m (- (+ 15 (intdiv (* 3 k) 4)) (intdiv (+ (* 8 k) 13) 25)))
       (s (- 2 (+ (* k 3) 3)))
       (a (modulo year 19))
       (d (modulo (+ (* 19 a) m) 30))
       (r (+ (intdiv d 29) (* (- (intdiv d 28) (intdiv d 29)) (intdiv a 11))))
       (og (- (+ 21 d) r))
       (sz (modulo (- 7 (+ year (intdiv year 4) s)) 7))
       (oe (- 7 (modulo (- sz og) 7)))
       (os (+ oe og)))
      os)))

Seitdem ist mein verhältnis zum kalender und zu den terminen der kristlichen feste etwas angespannt. Und ich sage jetzt auch nicht mehr, dass mir die programmiersprache im grunde genommen egal ist, obwohl sie ja eigentlich wirklich egal ist. Aber so manche syntax kitzelt heftig im hirne.

Wer das datum lieber menschenlesbar (und nicht als anzahl tage im märz, also mit der ausgabe 33 für den 2. april) haben möchte, schreibe sich einfach noch eine kleine funkzjon dazu, etwa so eine:

(define easter-string-date
  (lambda (year)
    (let*
      ((mdays (easter-march-date year))
       (day (cond
              ((<= mdays 31) mdays)
              (else (- mdays 31))))
       (mname (cond
                ((<= mdays 31) "März")
                (else "April"))))
      (string-append (number->string day) ". " mname " " (number->string year)))))

Und wehe, mir sagt noch einmal jemand, meine perl-kwelltexte wäre unlesbar. 😉

(Man hätte damals lisp an die russen verkaufen sollen, um den kalten krieg ein paar jahrzehnte früher zu beenden. Mir ists übrigens im moment egal, wann ostern ist — hauptsache, der weihnachtliche terror und die ballernden knallköppe zum jahresschluss sind bald vorbei und es wird wieder wärmer draußen.)