/* ----------------------------------------------------------- *\
KalenderBerechnungen
\* ----------------------------------------------------------- */
public class KalenderBerechnungen
{
public static void main( String args[] )
{
int tag, monat, jahr=2002, wtag;
for(; jahr!=0 ;)
{
System.out.print("Tag eingeben : ");
tag = Stdin.intEingabe();
System.out.print("Monat eingeben : ");
monat = Stdin.intEingabe();
System.out.print("Jahr eingeben : ");
jahr = Stdin.intEingabe();
System.out.println("Das Datum ist im Bereich des gregorianischen Kalenders und ok : "
+ isDate(tag,monat,jahr));
System.out.println("Schaltjahr : " + isLeapYear(jahr));
System.out.println("Wochentag : " + getDayOfTheWeek2(tag, monat, jahr) );
int ostern[] = getEaster(jahr) ;
if (ostern[0]!=0)
System.out.println("Ostern ist am : " + ostern[0]+"."+ostern[1]+"."+ostern[2] );
else
System.out.println("Ostern : Jahreszahl ausserhalb des gregorianischen Kalenders");
}
} // end main
public static boolean isLeapYear(int year)
{
if ( year>1581 && (year%4==0 && year%100!=0 || year%400==0) ) // gregorian
return true;
if ( (4<year && year<1582) && year%4==0 ) // julian
return true;
if ( (-46<year && year<-8) && year%3==0 ) // julian false
return true;
return false;
}
public static boolean isDate(int tag, int mon, int year)
{
if ( year<1582 || mon<1 || mon>12 || tag<1)
return false;
// ab hier stimmt das jahr, der monat und der tag ist mindestens 1
if ( (mon==4 || mon==6 || mon==9 || mon==11) && tag>30 )
return false;
if ( (mon==1 || mon==3 || mon==5 || mon==7 || mon==8 || mon==10 || mon==12) && tag>31 )
return false;
if ( mon==2 && tag>29) // immer falsch
return false;
if ( mon==2 && !isLeapYear(year) && tag>28)
return false;
return true;
}
public static int getDayOfTheWeek( int tag, int monat, int year )
{
int h = monat , k = year ;
if ( monat <=2 )
{
h = monat + 12 ;
k = year - 1 ;
}
return (tag + 2*h + (3*h+3)/5 + k + k/4 - k/100 + k/400+1)%7;
}
public static String getDayOfTheWeek2( int tag, int monat, int year )
{
if (year>1581)
{
int h = monat , k = year ;
if ( monat <=2 )
{
h = monat + 12 ;
k = year - 1 ;
}
int wtag = (tag + 2*h + (3*h+3)/5 + k + k/4 - k/100 + k/400+1)%7;
String tage[] =
{ "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag" } ;
return tage[wtag] ;
}
return "Jahreszahl ausserhalb des gregorianischen Kalenders" ;
}
public static int[] getEaster(int year)
{
if (year>1581)
{
int a, b, c, d, e, p, q, r, x, y, tag, monat ;
//Es geht um die Berechnung der Größen d und e
//Dazu braucht man die 9 Hilfsgrößen a, b, c, p, n, q, r, x, y !!
p = year/100 ;
q = p/3 ; r = p/4 ;
x = (15+p-q-r)%30 ; y = (4+p-r)%7 ;
a = year%19 ; b = year%4 ; c = year%7 ;
d = (19*a+x)%30 ;
e = (2*b+4*c+6*d+y)%7 ;
if (d==29 && e==6)
{
//=> Ostern am 19.April
tag=19; monat=4;
}
else if (d==28 && e==6)
{
//=> Ostern am 18.April
tag=18; monat=4;
}
else if (22+d+e < 32) //ansonsten gilt
{
//=> Ostern am (22+d+e).März
tag=22+d+e; monat=3;
}
else
{
// => Ostern am (d+e-9).April
tag=d+e-9; monat=4;
}
return new int[] { tag, monat, year } ;
}
return new int[] { 0, 0, year } ;
}
} // // end class