#!/usr/bin/perl # # Author name: Thomas Tunsch # Creation date: 02.04.2001 (v1.05[a/pl]) # # Description: # ########################################################################### # Variablenliste # Version ($vers) # Kommentare ($k1, $k2, $k3) # Zähler ($z1, $z2) # Zwischenvariablen ($qe-Eingabe Tag, $me-Eingabe Monat, $ce-Eingabe Jahrhundert, $je-Eingabe Jahr (Zehner, Einer), $cje-Eingabe Jahr, $dateingalt) # Rechenvariablen ($q-Tag, $m-Monat, $cj-Jahr, $c-Jh., $j-Jahr im Jh., $mb, $cb, $jb, @WoTa, @jh, @z2, $do, $mo, $qo, $ao, $bo, $co, $omo, $omo03, $omo04, $nach) # Ergebnisvariablen ($fehler, $dg, $dj, $w, $diff, $oso, $schj, $schg) ########################################################################### ########################################################################### # KORREKTUREN # FEHLER_01 in sub RechneGreg und # FEHLER_02 in sub RechneJul: Klammern falsch gesetzt (03.05.2000) # FEHLER_03 in sub Ostern: fehlerhafte Umlaut-Ausgabe (17.09.2004), neue Variablen eingeführt ($omo03, $omo04), Korrektur der Variablen $FehlMeld3 und $FehlMeld4 # FEHLER_04 in sub Ostern: Datumsausgabe nur in Deutsch (02.11.2007), neue Variablen eingeführt ($ENomo03, $ENomo04, $ENomo; $ENoso) # Korrektur_05: $html012/$ENhtml012 neuer Pfad CSS; $k1/$vers angepasst; $k1 CC BY-SA ########################################################################### ########################################################################### # Variablen: Definitionen $vers = "1.05[a/pl]"; @WoTa = ("Samstag","Freitag","Donnerstag","Mittwoch","Dienstag","Montag","Sonntag","Samstag","Freitag","Donnerstag","Mittwoch","Dienstag","Montag","Sonntag","Samstag"); @ENWoTa = ("Saturday","Friday","Thursday","Wednesday","Tuesday","Monday","Sunday","Saturday","Friday","Thursday","Wednesday","Tuesday","Monday","Sunday","Saturday"); $MeldTrue = "ja"; $MeldFalse = "nein"; $Meld1 = "nur 1582-2399 !"; $Meld2 = "erst ab 1582 !"; $ENMeldTrue = "yes"; $ENMeldFalse = "no"; $ENMeld1 = "1582-2399 only !"; $ENMeld2 = "not before 1582 !"; $omo03 = ". M\ä\;rz"; $omo04 = ". April"; # neu nach FEHLER_04 $ENomo03 = "March "; $ENomo04 = "April "; $FormFeldLeer = "--"; $FormFeld1 = "tag"; $FormFeld2 = "monat"; $FormFeld3 = "jh"; $FormFeld4 = "jahr"; $FormFeld5 = "sprache"; $title1 = "Kalenderberechnungen"; $title2 = "Wochentag, Schaltjahre, Osterfest"; $ENtitle1 = "Calendar calculations"; $ENtitle2 = "Day of the week, leap year, Easter"; $ENtitle3 = "Date format: DD.MM.YYYY"; $html011 = "Content-type: text/html\n\n"; $html012 = "$title1 ($title2)\n"; $html013 = "

$title1

\n

$title2

\n"; $ENhtml012 = "$ENtitle1 ($ENtitle2)\n"; $ENhtml013 = "

$ENtitle1

\n

$ENtitle2

\n

$ENtitle3

\n"; $TabRowBeg = ""; $TabRowEnd = ""; $TabCellBeg = ""; $TabCellEnd = ""; $ErgFeld1 = "Datum"; $ErgFeld2 = "Wochentag (gregorianisch)"; $ErgFeld3 = "Wochentag (julianisch)"; $ErgFeld4 = "Differenz zwischen julianischem und
gregorianischem Kalender (Tage)"; $ErgFeld5 = "Ostersonntag"; $ErgFeld6 = "Schaltjahr gregorianisch ?"; $ErgFeld7 = "Schaltjahr julianisch ?"; $ENErgFeld1 = "Date"; $ENErgFeld2 = "Day of the week (Gregorian)"; $ENErgFeld3 = "Day of the week (Julian)"; $ENErgFeld4 = "Difference between Julian and
Gregorian calendar (days)"; $ENErgFeld5 = "Easter Sunday"; $ENErgFeld6 = "Gregorian leap year ?"; $ENErgFeld7 = "Julian leap year ?"; $FehlMeld0 = "FEHLER !"; $FehlMeld1 = "Alle Eingabefelder m\ü\;ssen ausgef\ü\;llt werden !"; $FehlMeld2 = "Ung\ü\;ltiges Datum: dieser Monat hat nur 30 Tage !"; # $FehlMeld3 = "Ung\ü\;ltiges Datum: dieser Monat hat h\ö\;chstens 29 Tage !"; # $FehlMeld4 = "Ung\ü\;ltiges Datum (kein Schaltjahr): dieser Monat hat h\ö\;chstens 28 Tage !"; $FehlMeld3 = "Ung\ü\;ltiges Datum: dieser Monat hat h\ö\;chstens 29 Tage !"; $FehlMeld4 = "Ung\ü\;ltiges Datum (kein Schaltjahr): dieser Monat hat h\ö\;chstens 28 Tage !"; $ENFehlMeld0 = "ERROR !"; $ENFehlMeld1 = "All fields have to be filled !"; $ENFehlMeld2 = "Date not valid: this month has 30 days only !"; $ENFehlMeld3 = "Date not valid: this month has not more than 29 days !"; $ENFehlMeld4 = "Date not valid (no leap year): this month has not more than 28 days !"; $html01 = $html011.$html012.$html013; $ENhtml01 = $html011.$ENhtml012.$ENhtml013; $html99 = "\n"; $k1 = "\&\#169\; CC BY-SA 2000-2014 (v$vers), Thomas Tunsch"; $k2 = "Formel von Ch. Zeller (Butkewitsch, A. W.; Selikson, M. S.: Ewige Kalender. - Leipzig: BSB B. G. Teubner Verlagsgesellschaft, 1987 (5., überarb. Aufl.). - S. 87)"; $k3 = "Osterformel nach: Schlag nach: Natur. - Leipzig: VEB Bibliographisches Institut, 1954. - S. 86"; $k4 = "

Anmerkung

\nIm julianischen Kalender sind alle durch 4 teilbaren Jahre Schaltjahre, im gregorianischen Kalender ist es das jeweils letzte Jahr des Jahrhunderts nur, wenn es durch 400 teilbar ist. In Jahren, die durch 100, aber nicht durch 400 teilbar sind, gibt es im julianischen Kalender den 29.02., im gregorianischen nicht."; $ENk2 = "Calculation by Ch. Zeller (Butkewitsch, A. W.; Selikson, M. S.: Ewige Kalender. - Leipzig: BSB B. G. Teubner Verlagsgesellschaft, 1987 (5., rev. ed.). - p. 87)"; $ENk3 = "Calculation for Easter: Schlag nach: Natur. - Leipzig: VEB Bibliographisches Institut, 1954. - p. 86"; $ENk4 = "

Notice

\nIn the Julian calendar every year divisible by 4 is a leap year. In the Gregorian calendar the last year of the century is a leap year, if it's divisible by 400. In years divisible by 100, but not 400, there is a 29.02. in the Julian calendar, but not in the Gregorian."; ########################################################################### ########################################################################### # Formulardaten einlesen &lese_form; if($lang eq "EN") { # Sprachwahl (Variable) &sprache1; } # Eingabekontrolle &kontrolle; # Zerlegung des Datums in Bestandteile &eingabe; # Anpassung der Variablen nach Rechenvorschrift &AnpassVar; # Berechnung des Wochentages (gregorianisch) &RechneGreg; # Berechnung des Wochentages (julianisch); &RechneJul; # Differenz in Tagen zwischen Julianischem und Gregorianischem Kalender &DiffJulGreg; if(($cj < 1582) || ($cj > 2400)) { $oso = $Meld1; } else { &Ostern; } &Schaltjul; if($cj > 1581) { &Schaltgreg; } else { $schg = $Meld2; } if($lang eq "EN") { # Sprachwahl (Ergebnisse) &sprache2; } # Ergebnis &ergebnis; ########################################################################### ############################ # Formulardaten einlesen sub lese_form { # Uebergabe Standardeingabe in Skalar Daten read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'}); # Aufteilung des Datenstroms in Name-Wert-Paare @Formularfelder = split(/&/, $Daten); foreach $Feld (@Formularfelder) { ($name, $value) = split(/=/, $Feld); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s///g; $Formular{$name} = $name; $Formular{$value} = $value; if (($Formular{$name}) eq $FormFeld1) { $qe = $Formular{$value}; } if (($Formular{$name}) eq $FormFeld2) { $me = $Formular{$value}; } if (($Formular{$name}) eq $FormFeld3) { $ce = $Formular{$value}; } if (($Formular{$name}) eq $FormFeld4) { $je = $Formular{$value}; } if (($Formular{$name}) eq $FormFeld5) { $lang = $Formular{$value}; } } } ############################ # Sprachwahl (Variable) sub sprache1 { $FehlMeld0 = $ENFehlMeld0; @WoTa = @ENWoTa; $MeldTrue = $ENMeldTrue; $MeldFalse = $ENMeldFalse; $Meld1 = $ENMeld1; $Meld2 = $ENMeld2; } ############################ # Eingabekontrolle sub kontrolle { $fehler = 0; if ($qe eq $FormFeldLeer || $me eq $FormFeldLeer || $ce eq $FormFeldLeer || $je eq $FormFeldLeer) { $fehler = 1; } elsif (($me == 4 || $me == 6 || $me == 9 || $me == 11) && ($qe == 31)) { $fehler = 2; } elsif (($me == 2) && ($qe > 29)) { $fehler = 3; } } ############################ # Zerlegung des Datums in Bestandteile sub eingabe { $q = $qe; $m = $me; if($ce ne $FormFeldLeer && $je ne $FormFeldLeer) { $cje = $ce * 100 + $je; $cj = $cje; } else { $cje = $FormFeldLeer.$FormFeldLeer; $cj = $ce.$je; } if($q < 10 && $m < 10) { $dateingalt = "0$q.0$m.$cj"; } elsif($q < 10 && $m >= 10) { $dateingalt = "0$q.$m.$cj"; } elsif($q >= 10 && $m < 10) { $dateingalt = "$q.0$m.$cj"; } else { $dateingalt = "$q.$m.$cj"; } # 0-- durch -- ersetzen $dateingalt =~ s/0$FormFeldLeer/$FormFeldLeer/g; $c = int($cj / 100); $j = $cj % 100; } ############################ # Anpassung der Variablen nach Rechenvorschrift sub AnpassVar { $mb = $m; $cb = $c; $jb = $j; if($m < 3) { if ($j == 0) { $jb = 99; $cb = $c - 1; } else { $jb = $j - 1; } if($m == 1) { $mb = 13; } else { $mb = 14; } } } ############################ # Berechnung des Wochentages (gregorianisch) sub RechneGreg { #FEHLER_01 # $dg = $q + (int(($mb + 1) * 26) / 10) + $jb + int($jb / 4) + int($cb / 4) - 2 * $cb; #FEHLER_01 $dg = $q + int((($mb + 1) * 26) / 10) + $jb + int($jb / 4) + int($cb / 4) - 2 * $cb; $dg = $dg % 7; $w = $dg; &WoTa; $dg = $w; } ############################ # Berechnung des Wochentages (julianisch) sub RechneJul { #FEHLER_02 # $dj = $q + (int(($mb + 1) * 26) / 10) + $jb + int($jb / 4) + 5 - $cb; #FEHLER_02 $dj = $q + int((($mb + 1) * 26) / 10) + $jb + int($jb / 4) + 5 - $cb; $dj = $dj % 7; $w = $dj; &WoTa; $dj = $w; } ############################ # nach neg. Werten f. 27.3.3400 u.a. eingefügt, Wochentagszählung gerät durcheinander # if($w < 0) { # $w = -$w; # } # offensichtl. richtige Lösung: Fortführung der Zählung in neg. Richtung sub WoTa { if(($w > 7) || ($w < -7)) { $w = $FehlMeld0; goto EndWoTa; } $z2 = 7; for(@WoTa) { if($w == $z2) { $w = $_; goto EndWoTa; } $z2 = $z2 - 1; } EndWoTa: } ############################ # Differenz in Tagen zwischen Julianischem und Gregorianischem Kalender # nach 1.3. sub DiffJulGreg { if($m >= 3) { $nach = 1; } else { $nach = 0; } if((($c < 1)) || (($c > 36) && ($j > 0))) { $diff = "X"; } else { &Konst; } # zusätzliche Bedingung ($c % 4) != 0, da sonst in durch 4 teilbaren Jh. zwischen 1.1. und 29.2. Diff. um einen Tag zu niedrig if(($j == 0) && ($nach == 0) && (($c % 4) != 0)) { $diff = $diff - 1; } } ############################ sub Konst { $diff = -3; @jh = (1,2,3,5,6,7,9,10,11,13,14,15,17,18,19,21,22,23,25,26,27,29,30,31,33,34,35,37); for(@jh) { $diff = $diff + 1; if($_ > $c) { goto EndKonst; } } EndKonst: } ############################ sub Ostern { $do = 10; @z2 = (1700,1800,1900,2100,2200,2300); for(@z2) { if($cj < $_) { goto EndOstern1; } $do = $do + 1; # $do++ ; } EndOstern1: if ($do == 10) { $mo = 202; } elsif($do == 11) { $mo = 203; } elsif($do == 12) { $mo = 203; } elsif($do == 13) { $mo = 204; } elsif($do == 14) { $mo = 204; } elsif($do == 15) { $mo = 205; } elsif($do == 16) { $mo = 206; } else { $oso = $FehlMeld0; goto EndOstern2; } $qo = int($cj / 4); $ao = $cj % 19; $bo = ($mo - 11 * $ao) % 30; if((($bo == 28) || ($bo == 29)) && (($mo == 202) || ($mo == 204) || ($mo == 205))) { $bo = $bo - 1; } $co = ($cj + $qo + $bo - $do) % 7; $oso = 28 + $bo - $co; if($oso > 31) { $oso = $oso - 31; # $omo = ". April"; $omo = $omo04; # neu nach FEHLER_04 $ENomo = $ENomo04; } else { # $omo = ". M\ä\;rz"; $omo = $omo03; # neu nach FEHLER_04 $ENomo = $ENomo03; } # neu nach FEHLER_04 $ENoso = $oso; $oso = $oso.$omo; EndOstern2: } ############################ sub Schaltjul { $z2 = $cj % 4; if($z2 == 0) { $schj = $MeldTrue; } else { $schj = $MeldFalse; } } ############################ sub Schaltgreg { if($j == 0) { $z2 = $cj % 400; if($z2 == 0) { $schg = $MeldTrue; } else { $schg = $MeldFalse; } goto SchaltgregEnd; } $schg = $schj; SchaltgregEnd: } ############################ # Sprachwahl (Ergebnisse) sub sprache2 { $title1 = $ENtitle1; $title2 = $ENtitle2; $html012 = $ENhtml012; $html013 = $ENhtml013; $html01 = $ENhtml01; $ErgFeld1 = $ENErgFeld1; $ErgFeld2 = $ENErgFeld2; $ErgFeld3 = $ENErgFeld3; $ErgFeld4 = $ENErgFeld4; $ErgFeld5 = $ENErgFeld5; $ErgFeld6 = $ENErgFeld6; $ErgFeld7 = $ENErgFeld7; $FehlMeld0 = $ENFehlMeld0; $FehlMeld1 = $ENFehlMeld1; $FehlMeld2 = $ENFehlMeld2; $FehlMeld3 = $ENFehlMeld3; $FehlMeld4 = $ENFehlMeld4; $k2 = $ENk2; $k3 = $ENk3; $k4 = $ENk4; # neu nach FEHLER_04 $oso = $ENomo.$ENoso; } ############################ # Ergebnis sub ergebnis { print "$html01"; if(($fehler == 0) && ($me == 2) && ($qe > 28) && ($schj eq $MeldFalse) && ($schg eq $MeldFalse)) { $fehler = 4; } if($fehler != 0) { print "

$FehlMeld0

"; print "$dateingalt

"; if($fehler == 1) { print "$FehlMeld1"; } if($fehler == 2) { print "$FehlMeld2"; } if($fehler == 3) { print "$FehlMeld3"; } if($fehler == 4) { print "$FehlMeld4"; } print "


"; } if($fehler == 0) { print ""; print "$TabRowBeg"; print "$TabCellBeg"; print "$ErgFeld1"; print "$TabCellEnd"; print "$TabCellBeg"; print "$dateingalt"; print "$TabCellEnd"; print "$TabRowEnd"; print "$TabRowBeg"; print "$TabCellBeg"; print "$ErgFeld2"; print "$TabCellEnd"; print "$TabCellBeg"; print "$dg"; print "$TabCellEnd"; print "$TabRowEnd"; print "$TabRowBeg"; print "$TabCellBeg"; print "$ErgFeld3"; print "$TabCellEnd"; print "$TabCellBeg"; print "$dj"; print "$TabCellEnd"; print "$TabRowEnd"; print "$TabRowBeg"; print "$TabCellBeg"; print "$ErgFeld4"; print "$TabCellEnd"; print "$TabCellBeg"; print "$diff"; print "$TabCellEnd"; print "$TabRowEnd"; print "$TabRowBeg"; print "$TabCellBeg"; print "$ErgFeld5 ($cj)"; print "$TabCellEnd"; print "$TabCellBeg"; print "$oso"; print "$TabCellEnd"; print "$TabRowEnd"; print "$TabRowBeg"; print "$TabCellBeg"; print "$cj - $ErgFeld6"; print "$TabCellEnd"; print "$TabCellBeg"; print "$schg"; print "$TabCellEnd"; print "$TabRowEnd"; print "$TabRowBeg"; print "$TabCellBeg"; print "$cj - $ErgFeld7"; print "$TabCellEnd"; print "$TabCellBeg"; print "$schj"; print "$TabCellEnd"; print "$TabRowEnd"; print "
"; print "
\n"; if(($qe == 29) && ($me == 2) && ($schj eq $MeldTrue) && ($schg eq $MeldFalse)) { print "$k4"; print "
\n"; print "
\n"; } } print "
"; print "$k1"; print "
\n"; print "
\n"; print "$k2"; print "
\n"; print "$k3"; print "
\n"; print "
"; print "$html99"; }