#!/usr/bin/perl -w ################################################################################ ### Berechne kirchliche Feiertage und Sonntage ### Dies ist kein schönes Programm, aber es funktioniert ;-) ### Es ist Bestandteil des Terminkalenders, den ich für die evangelische ### Emmmaus-Ölberg Kirchengemeinde programmiere. ### ### Ausgabe ist eine Liste der Feiertage aus STDOUT und ein File mit ### SQL Befehlen, in der Datei FEIERTAGE.SQL im aktuellen Directory. ### ### Letzendlich war dieses Programm nur eine kleine Hilfsroutine um mir ### Tipp-- und Denkarbeit in zu ersparen :-) ### ### LIZENZBEDINGUNG (in englisch): ### ### This program is free software; you can redistribute it and/or ### modify it under the same terms as Perl itself, i.e., under the ### terms of the "Artistic License" or the "GNU General Public License". ### ### Please refer to the files "Artistic.txt", "GNU_GPL.txt" and ### "GNU_LGPL.txt" in this distribution for details! ### ### DISCLAIMER ### ### This package is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ### ### See the "GNU General Public License" for more details. ### ### Autor: Volker Kroll ### (c) Volker Kroll 2004 ################################################################################ use Date::Calc qw(Easter_Sunday Add_Delta_Days Day_of_Week Delta_Days); use Data::Dumper; use strict; my @tage; my @sql; my $y; for ($y = 2008; $y < 2038; $y++) { rechne($y); } #rechne(2036); sub rechne { my $year = shift || die "Please submit a year"; my $offset = { "Letzter Sonntag nach Epiphanias" => -70, "Septuagesimae / 3. Sonntag vor der Passionszeit" => -63, "Sexagesimae / 2. Sonntag vor der Passionszeit" => -56, "Estomihi / Sonntag vor der Passionszeit" => -49, Rosenmontag => -48, Faschingsdienstag => -47, Aschermittwoch => -46, "Invocabit / 1. Fastensonntag" => -42, "Reminscere / 2. Fastensonntag" => -35, "Oculi / 3. Fastensonntag" => -28, "Laetare / 4. Fastensonntag" => -21, "Judica / 5. Fastensonntag" => -14, "Palmarum / 6. Fastensonntag" => -7, Gruendonnerstag => -3, Karfreitag => -2, Ostersamstag => -1, Ostermontag => 1, "Quasimodogeniti / 1. Sonntag nach Ostern" => 7, "Misericordias Domini / 2. Sonntag nach Ostern" => 14, "Jubilate / 3. Sonntag nach Ostern" => 21, "Cantate / 4. Sonntag nach Ostern" => 28, "Rogate / 5. Sonntag nach Ostern" => 35, Himmelfahrt => 39, "Exaudi / 6. Sonntag nach Ostern" => 42, Pfingstsonntag => 49, Pfingstmontag => 50, Trinitatis => 56, Fronleichnam => 60 }; my $easter = {}; ($easter->{year}, $easter->{month}, $easter->{day}) = Easter_Sunday($year); my $feiertage = {}; $feiertage = festeTage($year, $feiertage); foreach (keys %$offset) { ($feiertage->{$_}->{year}, $feiertage->{$_}->{month}, $feiertage->{$_}->{day}) = Add_Delta_Days($easter->{year}, $easter->{month}, $easter->{day}, $offset->{$_}); } my $weekday_ha = Day_of_Week($year, 12, 24); if ($weekday_ha == 7) { $weekday_ha = 0; } ($feiertage->{"4. Advent"}->{year}, $feiertage->{"4. Advent"}->{month}, $feiertage->{"4. Advent"}->{day} ) = Add_Delta_Days($year, 12, 24, -$weekday_ha); ($feiertage->{"1. Sonntag nach dem Christfest"}->{year}, $feiertage->{"1. Sonntag nach dem Christfest"}->{month}, $feiertage->{"1. Sonntag nach dem Christfest"}->{day} ) = Add_Delta_Days ($feiertage->{"4. Advent"}->{year}, $feiertage->{"4. Advent"}->{month}, $feiertage->{"4. Advent"}->{day}, 7); my $d = 7; for (my $i = 3; $i > 0; $i --) { ($feiertage->{"$i. Advent"}->{year}, $feiertage->{"$i. Advent"}->{month}, $feiertage->{"$i. Advent"}->{day} ) = Add_Delta_Days( $feiertage->{"4. Advent"}->{year}, $feiertage->{"4. Advent"}->{month}, $feiertage->{"4. Advent"}->{day}, -$d); $d = $d + 7; } ($feiertage->{"Drittletzter Sonntag des Kirchenjahres"}->{year}, $feiertage->{"Drittletzter Sonntag des Kirchenjahres"}->{month}, $feiertage->{"Drittletzter Sonntag des Kirchenjahres"}->{day} ) = Add_Delta_Days( $feiertage->{"1. Advent"}->{year}, $feiertage->{"1. Advent"}->{month}, $feiertage->{"1. Advent"}->{day}, -21); ($feiertage->{"Vorletzter Sonntag des Kirchenjahres / Volkstrauertag"}->{year}, $feiertage->{"Vorletzter Sonntag des Kirchenjahres / Volkstrauertag"}->{month}, $feiertage->{"Vorletzter Sonntag des Kirchenjahres / Volkstrauertag"}->{day} ) = Add_Delta_Days( $feiertage->{"1. Advent"}->{year}, $feiertage->{"1. Advent"}->{month}, $feiertage->{"1. Advent"}->{day}, -14); ($feiertage->{"Buß - und Bettag"}->{year}, $feiertage->{"Buß - und Bettag"}->{month}, $feiertage->{"Buß - und Bettag"}->{day} ) = Add_Delta_Days( $feiertage->{"1. Advent"}->{year}, $feiertage->{"1. Advent"}->{month}, $feiertage->{"1. Advent"}->{day}, -11); ($feiertage->{"Letzter Sonntag des Kirchenjahres / Ewigkeitssonntag "}->{year}, $feiertage->{"Letzter Sonntag des Kirchenjahres / Ewigkeitssonntag "}->{month}, $feiertage->{"Letzter Sonntag des Kirchenjahres / Ewigkeitssonntag "}->{day} ) = Add_Delta_Days( $feiertage->{"1. Advent"}->{year}, $feiertage->{"1. Advent"}->{month}, $feiertage->{"1. Advent"}->{day}, -7); $feiertage = SonntageNachTrinitatis($feiertage); $feiertage = SonntageNachEpiphanias($feiertage); foreach(keys %$feiertage) { if ($feiertage->{$_}->{month} < 10) { $feiertage->{$_}->{month} = "0". $feiertage->{$_}->{month} ; } if ($feiertage->{$_}->{day} < 10) { $feiertage->{$_}->{day} = "0". $feiertage->{$_}->{day} ; } my $tag = $feiertage->{$_}->{year}. "-". $feiertage->{$_}->{month}. "-". $feiertage->{$_}->{day}. "\t$_". "\n"; my $sql = 'INSERT INTO Feiertage SET Datum = "' . $feiertage->{$_}->{year}. "-". $feiertage->{$_}->{month}. "-". $feiertage->{$_}->{day}. '", Bezeichnung = "'. $_ .'";'. "\n"; push (@tage, $tag); push (@sql, $sql); } } sub SonntageNachEpiphanias { my $f = shift; my $delta = Delta_Days( $f->{"Epiphanias"}->{year}, $f->{"Epiphanias"}->{month}, $f->{"Epiphanias"}->{day}, $f->{"Letzter Sonntag nach Epiphanias"}->{year}, $f->{"Letzter Sonntag nach Epiphanias"}->{month}, $f->{"Letzter Sonntag nach Epiphanias"}->{day} ); my $sonntage = int($delta / 7); my $s = 0; for(my $i = $sonntage; $i > 0; $i--) { $s++; ($f->{"$s. Sonntag nach Epiphanias"}->{year}, $f->{"$s. Sonntag nach Epiphanias"}->{month}, $f->{"$s. Sonntag nach Epiphanias"}->{day} ) = Add_Delta_Days( $f->{"Letzter Sonntag nach Epiphanias"}->{year}, $f->{"Letzter Sonntag nach Epiphanias"}->{month}, $f->{"Letzter Sonntag nach Epiphanias"}->{day}, -( $i * 7) ); } return $f; } sub SonntageNachTrinitatis { my $f = shift; for(my $i = 1; $i < 25; $i++) { ($f->{"$i. Sonntag nach Trinitatis"}->{year}, $f->{"$i. Sonntag nach Trinitatis"}->{month}, $f->{"$i. Sonntag nach Trinitatis"}->{day}) = Add_Delta_Days($f->{"Trinitatis"}->{year}, $f->{"Trinitatis"}->{month}, $f->{"Trinitatis"}->{day}, ($i * 7) ); if ( Delta_Days( $f->{"$i. Sonntag nach Trinitatis"}->{year}, $f->{"$i. Sonntag nach Trinitatis"}->{month}, $f->{"$i. Sonntag nach Trinitatis"}->{day}, $f->{"Drittletzter Sonntag des Kirchenjahres"}->{year}, $f->{"Drittletzter Sonntag des Kirchenjahres"}->{month}, $f->{"Drittletzter Sonntag des Kirchenjahres"}->{day} ) == 0 ) { delete $f->{"$i. Sonntag nach Trinitatis"}; last; } } return $f; } sub festeTage { my $year = shift; my $feiertag = shift; $feiertag->{"Tag der Beschneidung und Namensgebung Jesu"}->{year} = $year; $feiertag->{"Tag der Beschneidung und Namensgebung Jesu"}->{month} = 1; $feiertag->{"Tag der Beschneidung und Namensgebung Jesu"}->{day} = 1; $feiertag->{"Epiphanias"}->{year} = $year; $feiertag->{"Epiphanias"}->{month} = 1; $feiertag->{"Epiphanias"}->{day} = 6; $feiertag->{"Tag der Darstellung des Herrn"}->{year} = $year; $feiertag->{"Tag der Darstellung des Herrn"}->{month} = 2; $feiertag->{"Tag der Darstellung des Herrn"}->{day} = 2; $feiertag->{"Mariä Empfängnis"}->{year} = $year ; $feiertag->{"Mariä Empfängnis"}->{month} = 3 ; $feiertag->{"Mariä Empfängnis"}->{day} = 25; $feiertag->{"Tag der Geburt Johannes des Täufers"}->{year} =$year; $feiertag->{"Tag der Geburt Johannes des Täufers"}->{month} =6 ; $feiertag->{"Tag der Geburt Johannes des Täufers"}->{day} = 24; $feiertag->{"Peter und Paul"}->{year} = $year; $feiertag->{"Peter und Paul"}->{month} = 6; $feiertag->{"Peter und Paul"}->{day} = 29; $feiertag->{"Tag der Heimsuchung Mariä"}->{year} = $year ; $feiertag->{"Tag der Heimsuchung Mariä"}->{month} = 7 ; $feiertag->{"Tag der Heimsuchung Mariä"}->{day} = 2 ; $feiertag->{"Mariä Himmelfahrt"}->{year} = $year; $feiertag->{"Mariä Himmelfahrt"}->{month} = 8; $feiertag->{"Mariä Himmelfahrt"}->{day} = 15; $feiertag->{"Mariä Geburt"}->{year} = $year; $feiertag->{"Mariä Geburt"}->{month} = 9 ; $feiertag->{"Mariä Geburt"}->{day} = 8 ; $feiertag->{"Kreuzerhöhung"}->{year} = $year; $feiertag->{"Kreuzerhöhung"}->{month} = 9 ; $feiertag->{"Kreuzerhöhung"}->{day} = 14 ; $feiertag->{"Michaelis"}->{year} = $year; $feiertag->{"Michaelis"}->{month} = 9; $feiertag->{"Michaelis"}->{day} = 29; $feiertag->{"Teresa vom Kinde Jesu"}->{year} = $year; $feiertag->{"Teresa vom Kinde Jesu"}->{month} = 10; $feiertag->{"Teresa vom Kinde Jesu"}->{day} = 1; $feiertag->{"Franz von Assisi"}->{year} = $year; $feiertag->{"Franz von Assisi"}->{month} = 10; $feiertag->{"Franz von Assisi"}->{day} = 4; $feiertag->{"Teresa von Avila"}->{year} = $year; $feiertag->{"Teresa von Avila"}->{month} = 10; $feiertag->{"Teresa von Avila"}->{day} = 15; $feiertag->{"Reformationstag"}->{year} = $year; $feiertag->{"Reformationstag"}->{month} = 10; $feiertag->{"Reformationstag"}->{day} = 31; $feiertag->{"Allerheiligen"}->{year} = $year; $feiertag->{"Allerheiligen"}->{month} = 11 ; $feiertag->{"Allerheiligen"}->{day} = 1 ; $feiertag->{"Allerseelen"}->{year} = $year; $feiertag->{"Allerseelen"}->{month} = 11 ; $feiertag->{"Allerseelen"}->{day} = 2 ; $feiertag->{"Weihetag der Lateranbasilika"}->{year} = $year; $feiertag->{"Weihetag der Lateranbasilika"}->{month} = 11 ; $feiertag->{"Weihetag der Lateranbasilika"}->{day} = 1 ; $feiertag->{"Hochfest der ohne ErbsÜnde empfangenen Jungfrau und Gottesmutter Maria"}->{year} = $year; $feiertag->{"Hochfest der ohne ErbsÜnde empfangenen Jungfrau und Gottesmutter Maria"}->{month} = 12; $feiertag->{"Hochfest der ohne ErbsÜnde empfangenen Jungfrau und Gottesmutter Maria"}->{day} = 8; $feiertag->{"Johannes vom Kreuz"}->{year} = $year; $feiertag->{"Johannes vom Kreuz"}->{month} = 12; $feiertag->{"Johannes vom Kreuz"}->{day} = 14; $feiertag->{"Heiliger Abend"}->{year} = $year; $feiertag->{"Heiliger Abend"}->{month} = 12; $feiertag->{"Heiliger Abend"}->{day} = 24; $feiertag->{"Erster Weihnachtstag"}->{year} = $year; $feiertag->{"Erster Weihnachtstag"}->{month} = 12; $feiertag->{"Erster Weihnachtstag"}->{day} = 25; $feiertag->{"Zweiter Weihnachtstag / St. Stephanus"}->{year} = $year; $feiertag->{"Zweiter Weihnachtstag / St. Stephanus"}->{month} = 12; $feiertag->{"Zweiter Weihnachtstag / St. Stephanus"}->{day} = 26; $feiertag->{"Fest der unschuldigen Kinder"}->{year} = $year; $feiertag->{"Fest der unschuldigen Kinder"}->{month} = 12; $feiertag->{"Fest der unschuldigen Kinder"}->{day} = 28; $feiertag->{"Fest der heiligen Familie"}->{year} = $year; $feiertag->{"Fest der heiligen Familie"}->{month} = 12; $feiertag->{"Fest der heiligen Familie"}->{day} = 30; $feiertag->{"Sylvester"}->{year} = $year; $feiertag->{"Sylvester"}->{month} = 12; $feiertag->{"Sylvester"}->{day} = 31; return $feiertag; } print sort @tage; open SQL, "> FEIERTAGE.SQL"; print SQL sort @sql; close SQL;