package kalender;
public class KalenderFunktionen
{
static final int MaxAnzahlTageImJahr = 365;/* ohne Schalttag */
static final int TageProWoche = 7;
static final String[] monatsname =
{null,"Januar","Februar","Maerz","April","Mai","Juni","Juli",
"August","September","Oktober","November","Dezember"};
static final int[] monatslaenge = {0,31,28,31,30,31,30,31,31,30,31,30,31};
static final String[] wochentag =
{"Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"};
static final String[] wochentagkurz = {"So","Mo","Di","Mi","Do","Fr","Sa"};
/* --------- Feiertage mit festem Datum ----------- */
static final String Neujahr = new String("01.01");
static final String HlgDreiKoenige = new String("06.01");
static final String Valentinstag = new String("14.02");
static final String Maifeiertag = new String("01.05");
static final String MariaHimmelfahrt = new String("15.08");
static final String TagDerEinheit = new String("03.10");
static final String Allerheiligen = new String("01.11");
static final String Nikolaus = new String("06.12");
static final String Heiligabend = new String("24.12");
static final String ErsterWeihnachtstag = new String("25.12");
static final String ZweiteWeihnachtstag = new String("26.12");
static final String Silvester = new String("31.12");
/* --------- von OSTERN abhaengige Feiertage ------------- */
int Rosenmontag( int jahr )
{ return ostersonntag(jahr) - 48; }
int Aschermittwoch( int jahr )
{ return ostersonntag(jahr) - 46; }
int Gruendonnerstag( int jahr )
{ return ostersonntag(jahr) - 3; }
int Karfreitag( int jahr )
{ return ostersonntag(jahr) - 2; }
int Ostermontag( int jahr )
{ return ostersonntag(jahr) + 1; }
int ChristiHimmelfahrt( int jahr )
{ return ostersonntag(jahr) + 39; }
int Pfingstsonntag( int jahr )
{ return ostersonntag(jahr) + 49; }
int Pfingstmontag( int jahr )
{ return ostersonntag(jahr) + 50;}
int Fronleichnam( int jahr )
{ return ostersonntag(jahr) + 60; }
/* --------- Feiertage mit festem Wochentag ------------
* VierteAdvent 1.te Sonntag vor ErsterWeihnachtstag
* DritteAdvent 2.te Sonntag vor ErsterWeihnachtstag
* ZweiteAdvent 3.te Sonntag vor ErsterWeihnachtstag
* ErsteAdvent 4.te Sonntag vor ErsterWeihnachtstag
* Totensonntag 5.te Sonntag vor ErsterWeihnachtstag
* Volkstrauertag 6.te Sonntag vor ErsterWeihnachtstag
* BussBetTag Mittwoch vor 5.te Sonntag vor ErsterWeihnachtstag
*/
/* --------- Sommer- / Winterzeit ------------
* Sommerzeit 1.te Sonntag vor dem 01.04
* Winterzeit 1.te Sonntag vor dem 01.11
*/
/**
=========================================================================
* Funktion: istSchaltjahr( int jahr )
* Parameter: jahr (int) : das Jahr, das auf Schaltjahr ueberprueft wird
* Rueckgabe: (boolean) : true, wenn das Jahr ein Schaltjahr ist
* : false, wenn das Jahr nicht Schaltjahr ist
* Beschreibung: jedes 4.te Jahr ist Schaltjahr,
* (wenn sich das Jahr durch 4 ohne Rest teilen laesst, ist es Schaltjahr )
* Ausnahme davon jedes 100.te Jahr ist kein Schaltjahr
* (wenn sich das Jahr durch 100 ohne Rest teilen laesst, ist es kein Schaltjahr)
* Ausnahme davon jedes 400.ter Jahr ist wieder Schaltjahr
* (wenn sich das Jahr durch 400 ohne Rest teilen laesst, ist es Schaltjahr)
* =========================================================================
*/
boolean istSchaltjahr(int jahr)
{
return ((jahr%4 == 0 )&&((jahr%100 != 0 )||( jahr%400 == 0 )));
}
/**
=========================================================================
* Funktion: schaltjahr(int jahr)
* Parameter: jahr (int) : das Jahr, das auf Schaltjahr ueberprueft wird
* Rueckgabe: (int) : 1 = true, wenn das Jahr ein Schaltjahr ist
* : 0 = false, wenn das Jahr nicht Schaltjahr ist
* Beschreibung: siehe --> istSchaltjahr(long jahr)
* =========================================================================
*/
int schaltjahr(int jahr)
{
if(istSchaltjahr(jahr)) return 1;
else return 0;
}
/**
=========================================================================
* Funktion: tage_seit_begin( int tag, int monat, int jahr)
* Parameter: tag (int) : Tag
* monat (int) : Monat
* jahr (int) : Jahr
* Rueckgabe: (long) : Anzahl der Tage seit Begin (das Jahr 1)
* Beschreibung: die Berechnung der Anzahl der Tage seit dem Jahr 1 nach dem
* gregorianischen Kalender,
* was historisch nicht korrekt ist, da der gregor. Kalender erst
* seit 1582 in Kraft trat.
* =========================================================================
*/
long tage_seit_begin( int tag, int monat, int jahr)
{
int summe,
i;
summe = MaxAnzahlTageImJahr * (jahr -1); /* Anzahl der Tage aller vergangenen Jahre */
summe += ( (jahr -1) / 4 ); /* plus alle vergangenen Schalttage */
summe -= ( (jahr -1) / 100); /* minus alle Schalttage, die zuviel berechnet wurden */
summe += ( (jahr -1) / 400); /* plus alle Schalttage, die alle 400 Jahr anfallen */
// if( monat != 1 )
for(i = 1;i<monat;i++)
summe += tage_im_monat( i, jahr ); /* plus alle Tage vergangener Monate */
summe += tag; /* plus alle restlichen Tage des Monats */
return ( summe );
}
/**
=========================================================================
* Funktion: tage_im_monat( int monat, int jahr)
* Parameter: monat (int) : Monat
* jahr (int) : Jahr
* Rueckgabe: (int) : Anzahl der Tage in einem Monat
* Beschreibung: gibt die Anzahl der Tage im Monat zurueck
* =========================================================================
*/
int tage_im_monat( int monat, int jahr)
{
if( (monat != 2)||((monat == 2)&&(!istSchaltjahr(jahr)) ) )
return monatslaenge[monat];
else return ( monatslaenge[monat] + 1 ); /* Schalttag beruecksichtigen */
}
/**
=========================================================================
* Funktion: julian_date (int jahr, int monat, int tag)
* Parameter: tag (int) : Tag
* monat (int) : Monat
* jahr (int) : Jahr
* Rueckgabe: (long) : Anzahl der Tage seit dem 1.1.4713 vor Christus
* Beschreibung: Das Julianische Datum gibt die Anzahl der Tage
* seit dem 1.1.4713 vor Christus an.
* Algorithmus von R. G. Tantzen
* =========================================================================
*/
long julian_date(int tag, int monat, int jahr)
{
long c, y;
if (monat>2)
monat = monat - 3;
else
{
monat = monat + 9;
jahr--;
}
tag = tag + (153*monat+2) / 5;
c = (146097L * (jahr / 100L))/4L;
y = (1461L * (jahr % 100L))/4L;
return c+y+tag+1721119L;
}
/**
=========================================================================
* Funktion: tagesnummer(int tag, int monat, int jahr)
* Parameter: tag (long) : Tag
* monat (long) : Monat
* jahr (long) : Jahr
* Rueckgabe: n (int) : Tagesnummer rel. zum Jahresanfang
* (1=1.1.,2=2.1.,...365/366=31.12)
* Beschreibung: Algorithmus von Robertson
* =========================================================================
*/
int tagesnummer(int tag, int monat, int jahr)
{
int d, e;
d = (monat+10)/13;
e = tag + (611*(monat+2))/20 - 2*d - 91;
return (e + schaltjahr (jahr) * d );
}
/**
=========================================================================
* Funktion: monat_im_jahr(int jahr, int n)
* Parameter: jahr (long) : Jahr
* n (int) : Tagesnummer rel. zum Jahresanfang
* (1=1.1.,2=2.1.,...365/366=31.12)
* Rueckgabe: (int) : Monat (1=Jan, 2=Feb, ... 12 = Dec)
* Beschreibung: Algorithmus von R. A. Stone
* =========================================================================
*/
int monat_im_jahr(int jahr, int n)
{
int a;
a = schaltjahr(jahr);
if ( n > 59+a )
n += 2-a;
n += 91;
return (20*n)/611 - 2;
}
/**
=========================================================================
* Funktion: tag_im_jahr(int jahr, int n)
* Parameter: jahr (long) : Jahr
* n (int) : Tagesnummer rel. zum Jahresanfang
* (1=1.1.,2=2.1.,...365/366=31.12)
* Rueckgabe: (int) : Ausgabe: Tag (1..31)
* Beschreibung: Algorithmus von R. A. Stone
* =========================================================================
*/
int tag_im_jahr(int jahr, int n)
{
int a, m;
a = schaltjahr(jahr);
if ( n > 59+a )
n += 2-a;
n += 91;
m = (20*n)/611;
return n - (611*m)/20;
}
/**
=========================================================================
* Funktion: wochentag_im_jahr(int jahr, int n)
* Parameter: jahr (long) : Jahr
* n (int) : Tagesnummer rel. zum Jahresanfang
* (1=1.1.,2=2.1.,...365/366=31.12)
* Rueckgabe: (int) : Wochentag (0=So, 1=Mo,..., 6=Sa)
* Beschreibung: Algorithmus von Zeller
* =========================================================================
*/
int wochentag_im_jahr(int jahr, int n)
{
int j, c;
j = (jahr-1) % 100;
c = (jahr-1) / 100;
return (28+j+n+(j/4)+(c/4)+5*c) % 7;
}
/**
=========================================================================
* Funktion: ostersonntag(int jahr)
* Parameter: jahr (long) : Jahr
* Rueckgabe: (int) : Tagesnummer des Ostersonntag rel. zum Jahresanfang
* Beschreibung: Algorithmus "Computus ecclesiasticus"
* 325 n.Chr. wurde Ostern auf den Sonntag nach
* dem ersten Fruehlingsvollmond festgelegt. Damit
* liegt Ostern zwischen dem 22. Maerz und dem 25. April.
* =========================================================================
*/
int ostersonntag(int jahr)
{
int gz, jhd, ksj, korr, so, epakte, n;
gz = (jahr%19)+1;
jhd = jahr/100+1;
ksj = (3*jhd)/4-12;
korr = (8*jhd+5)/25-5;
so = (5*jahr)/4-ksj-10;
epakte = (11*gz+20+korr-ksj) % 30;
if ( (epakte == 25 && gz > 11) || epakte == 24 )
epakte++;
n = 44-epakte;
if ( n < 21 )
n = n + 30;
n = n + 7 - (so+n) % 7;
n += schaltjahr(jahr);
return n+59;
}
// Ergänzungen aus dateFunktionen.c
/**
* =========================================================================
* Funktion: istFeiertag( long jahr, int tagNr )
* Parameter: jahr (long) : Jahr
* tagNr (int) : Tagesnummer
// * Rueckgabe: (BOOL) : True (= Feiertag), False (= kein Feiretag)
* Rueckgabe: (String) : Text des Feiertages oder <code>null</code>
* Beschreibung: gibt True zurueck, wenn Datum ein Feiertag ist
* andernfalls False
* Allerdings werden die Feiertage nicht unterschieden in gesetzliche,
* regional abhängige, kommerzielle (Valentinstag), Winter- und Sommerzeit
* oder sonstige Ereignisse.
* =========================================================================
*/
String istFeiertag (int jahr, int tagNr )
{
int i;
// long monat, tag;
// monat = monat_im_jahr( jahr, tagNr );
// tag = tag_im_jahr( jahr, tagNr );
/* alle Feiertage, die vom Ostersonntsg abhaengen */
if( tagNr == ostersonntag( jahr )) return "Ostersonntag"; /* Ostersonntag */
else if ( tagNr == Ostermontag(jahr) ) return "Ostermontag";
else if ( tagNr == ChristiHimmelfahrt( jahr ) ) return "Christi Himmelfahrt";
else if ( tagNr == Pfingstsonntag( jahr ) ) return "Pfingstsonntag";
else if ( tagNr == Pfingstmontag( jahr ) ) return "Pfingstmontag";
else if ( tagNr == Fronleichnam( jahr ) ) return "Fronleichnam";
else if ( tagNr == Karfreitag( jahr ) ) return "Karfreitag";
else if ( tagNr == Gruendonnerstag( jahr ) ) return "Gruendonnerstag";
else if ( tagNr == Rosenmontag( jahr ) ) return "Rosenmontag";
else if ( tagNr == Aschermittwoch( jahr ) ) return "Aschermittwoch";
//+++ ACHTUNG! Korrektur 17.1.02 ++++++++++
int tagnrf;
for( i = 0;i<6;i++)
{ /* alle Feiertage mit festem Wochentag: 1.2.3.4.Advent,
Totensonntag, Volkstrauertag */
if( wochentag_im_jahr( jahr, tagesnummer( 25, 12, jahr) ) != 0)
{ // wenn der 25.12. kein Sonntag ist, liegen
// die Feiertage i Sonntage vor dem 25.12.
tagnrf = getFeiertag_festWotag(jahr, i);
}
else{
// wenn 25.12. ein Sonntag ist, dann darf der 4.Advent nicht auf
// denselben Sonntag fallen, sondern muss noch 1 Sonntag davor liegen!
tagnrf = getFeiertag_festWotag(jahr, i+1);
}
if (tagnrf == tagNr){
if(i < 4 ) return 4-i + ". Advent";
else if (i == 4 ) return "Totensonntag";
else return "Volktrauertag";
}
}
//+++ ACHTUNG! Korrektur 17.1.02 ++++++++++
tagnrf = getFeiertag_muttertag(jahr); /* Muttertag - Blumen schenken! */
if(tagnrf == tagNr) return "Muttertag - Blumen schenken";
tagnrf = getFeiertag_bussbettag(jahr); /* Buss und Bettag */
if(tagnrf == tagNr) return "Buss und Bettag";
tagnrf = getFeiertag_fest( Neujahr, jahr); /* Neujahr */
if(tagnrf == tagNr) return "Neujahr";
tagnrf = getFeiertag_fest( HlgDreiKoenige, jahr); /* Heiligen drei Koenige*/
if(tagnrf == tagNr) return "Heiligen drei Koenige";
tagnrf = getFeiertag_fest( Valentinstag, jahr); /* Valentinstag */
if(tagnrf == tagNr) return "Valentinstag";
tagnrf = getFeiertag_fest( Maifeiertag, jahr); /* 1.ter Mai */
if(tagnrf == tagNr) return "1.ter Mai";
tagnrf = getFeiertag_fest( MariaHimmelfahrt, jahr); /* Maria Himmelfahrt */
if(tagnrf == tagNr) return "Maria Himmelfahrt";
tagnrf = getFeiertag_fest( TagDerEinheit, jahr); /* Tag d. deut. Einheit */
if(tagnrf == tagNr) return "Tag d. deut. Einheit";
tagnrf = getFeiertag_fest( Allerheiligen, jahr); /* Allerheiligen */
if(tagnrf == tagNr) return "Allerheiligen";
tagnrf = getFeiertag_fest( Nikolaus, jahr); /* Nikolaus */
if(tagnrf == tagNr) return "Nikolaus";
tagnrf = getFeiertag_fest( Heiligabend, jahr); /* Heilig Abend */
if(tagnrf == tagNr) return "Heilig Abend";
tagnrf = getFeiertag_fest( ErsterWeihnachtstag, jahr); /* Weihnachten */
if(tagnrf == tagNr) return "1. Weihnachten";
tagnrf = getFeiertag_fest( ZweiteWeihnachtstag, jahr); /* Weihnachten */
if(tagnrf == tagNr) return "2. Weihnachten";
tagnrf = getFeiertag_fest( Silvester, jahr); /* Sylvester */
if(tagnrf == tagNr) return "Sylvester";
tagnrf = getWinterzeit( jahr); /* Beginn der Winterzeit */
if(tagnrf == tagNr) return "Beginn der Winterzeit";
tagnrf = getSommerzeit( jahr); /* Beginn der Sommerzeit */
if(tagnrf == tagNr) return "Beginn der Sommerzeit";
return null;
} // Ende istFeiertag
/**
* =========================================================================
* Funktion: getFeiertag_festWotag(int jahr, int anz_so)
* Parameter: jahr (int) : Datum (25.12.jjjj), ab dem gerechnet wird
* anz_so ( int) : der x.te Sonntag vor dem Datum
* Rueckgabe: (int) : Tagesnummer im Jahr
* Beschreibung: Hilfsfunktion, gibt den Sonntag zurueck, der vor dem
* uebergebenen Datum liegt
* -> fuer Feiertage mit festem Wochentag <-
* =========================================================================
*/
int getFeiertag_festWotag(int jahr, int anz_so)
{
int wotag, tagNr1, tagNr2;
tagNr1 = tagesnummer(25, 12, jahr);
wotag = wochentag_im_jahr( jahr, tagNr1);
tagNr2 = tagNr1 - wotag - (anz_so * 7);
return tagNr2;
} // Ende getFeiertag_festWotag
/**
* =========================================================================
* Funktion: getFeiertag_fest(char *str, int jahr)
* Parameter: str (char *): Zeichenkette, die Tag/Monat
* im Format "tt.mm" enthaelt
* jahr ( int) : Jahr
* Rueckgabe: (int) : Tagesnummer im Jahr
* Beschreibung: Hilfsfunktion, wandelt das Format "tt.mm" in Datumsstruktur um
* ->fuer Feiertage mit festem Datum <-
* =========================================================================
*/
int getFeiertag_fest(String str, int jahr)
{
int datumT, datumM;
String buffer_tag;
String buffer_monat;
/*
strncpy( buffer_tag, str, 2); buffer_tag[2]=StringEndekennung;
strncpy( buffer_monat, &str[3], 2 ); buffer_monat[2]=StringEndekennung;
datum.tag = atoi( buffer_tag );
datum.monat = atoi( buffer_monat );
datum.jahr = jahr;
return datum;
*/
buffer_tag = str.substring(0,2);
buffer_monat = str.substring(3,5);
datumT = Integer.parseInt(buffer_tag);
datumM = Integer.parseInt(buffer_monat);
return tagesnummer(datumT, datumM, jahr);
} // getFeiertag_fest
/**
* =========================================================================
* Funktion: getFeiertag_bussbettag(int jahr)
* Parameter: jahr (int) : Datum (25.12.jjjj), ab dem gerechnet wird
// * Rueckgabe: (Date) : Struktur, die Tag, Monat, Jahr als Integer enthaelt
* Rueckgabe: (int) : Tagesnummer im Jahr
* Beschreibung: gibt das Datum vom Buss- und Bettag zurueck (als Struktur Date)
* Buss-und Bettag ist immer 32 Tage vor dem letzten Sonntag vor dem 25.12.
* 32 Tage = (4 Sonntage * 7 Tage) + 4 Tage
* =========================================================================
*/
int getFeiertag_bussbettag(int jahr)
{
// Date datum_back;
int wotag, tagNr1, tagNr2;
int anz_so = 4; /* Anzahl der Sonntage */
tagNr1 = tagesnummer(25, 12, jahr);
wotag = wochentag_im_jahr( jahr, tagNr1);
tagNr2 = tagNr1 - wotag - (anz_so * 7) - 4;
// datum_back.tag = tag_im_jahr( jahr, tagNr2);
// datum_back.monat = monat_im_jahr( jahr, tagNr2);
// datum_back.jahr = jahr;
// return datum_back;
return tagNr2;
} // Ende getFeiertag_bussbettag
/**
* =========================================================================
* Funktion: getFeiertag_muttertag(int jahr)
* Parameter: jahr (int): Datum (30.04.jjjj), ab dem gerechnet wird
// * Rueckgabe: (Date) : Struktur, die Tag, Monat, Jahr als Integer enthaelt
* Rueckgabe: (int) : Tagesnummer im Jahr
* Beschreibung: gibt das Datum vom Muttertag zurueck (als Struktur Date)
* Muttertag ist immer 14 Tage nach dem letzten Sonntag im April. Falls dieser
* Tag Pfingstsonntag ist, wird der Muttertag eine Woche vorverlegt.
* =========================================================================
*/
int getFeiertag_muttertag(int jahr)
{
// Date datum_back;
int wotag, tagNr1, tagNr2;
int anz_so = 4;
tagNr1 = tagesnummer(30, 4, jahr);
wotag = wochentag_im_jahr( jahr, tagNr1);
tagNr2 = tagNr1 - wotag +14;
if( tagNr2 == Pfingstsonntag( jahr ) )
tagNr2 = tagNr2 - 7;
// datum_back.tag = tag_im_jahr( jahr, tagNr2);
// datum_back.monat = monat_im_jahr( jahr, tagNr2);
// datum_back.jahr = jahr;
// return datum_back;
return tagNr2;
} // Ende getFeiertag_muttertag
/**
* =========================================================================
* Funktion: getSommerzeit(long jahr)
* Parameter: jahr (int) : Jahr
* Rueckgabe: (int) : Tagesnummer im Jahr
* Beschreibung: gibt die Sommerzeit (1.te Sonntag vor dem 1.4.)
fuer das Jahr zurueck
* =========================================================================
*/
int getSommerzeit(int jahr)
{
return get_SW_Zeit(jahr, 4);
}
/**
* =========================================================================
* Funktion: getWinterzeit(long jahr)
* Parameter: jahr (int) : Jahr
* Rueckgabe: (int) : Tagesnummer im Jahr
* Beschreibung: gibt die Winterzeit (1.te Sonntag vor dem 1.11.)
fuer das Jahr zurueck
* =========================================================================
*/
int getWinterzeit(int jahr)
{
return get_SW_Zeit(jahr, 11);
}
/**
* =========================================================================
* Funktion: get_SW_Zeit(long jahr, int monat)
* Parameter: jahr (long) : Jahr
* monat (int) : Monat ( 4 = Sommerzeit, 11 = Winterzeit )
* Rueckgabe: (int) : Tagesnummer im Jahr
* Beschreibung: Hilfsfunktion zur Berechnung der Winter-/Sommerzeit
* =========================================================================
*/
int get_SW_Zeit(int jahr, int monat)
{
int wotag, tagNr1, tagNr2;
tagNr1 = tagesnummer(1, monat, jahr);
wotag = wochentag_im_jahr( jahr, tagNr1);
tagNr2 = tagNr1 - wotag;
return tagNr2;
} // Ende get_SW_Zeit
} // end of class KalFunk