// DatumOOP.java MM 2009 /** * Datum, Verwaltet ein Datum zwischen 1600 und 3000, * Gregorianischer Kalender gilt seit 1582. */ public class DatumOOP { /* ------------------------------------------------- */ // Attribute /** * Tag (1..28/29/30/31) */ private int tag; /** * Monat (1..12) */ private int monat; /** * Jahr (1600..3000) */ private int jahr; /** * Wochentag (Sonntag..Samstag) */ private String wochenTag = ""; /** * Schaltjahr. */ private boolean schaltJahr = false; /* ------------------------------------------------- */ // set-Methode /** * Setzt Datum, berechnet Wochentag. * @param tt Tag des Datums * @param mm Monat des Datums * @param ccjj Jahr des Datums * @return true, falls Datum korrekt */ public boolean setDatum( int tt, int mm, int ccjj) { // Überprüfen der Datumseingabe // Jahr if( ccjj < 1600 || ccjj > 3000) return false; jahr = ccjj; if( mm < 1 || mm > 12) return false; // Monat monat = mm; int cc = ccjj / 100; // Schaltjahr int jj = ccjj % 100; if( jj == 0) schaltJahr = cc % 4 == 0; else schaltJahr = jj % 4 == 0; int anzahl = 0; // Anzahl der Tage im Monat switch( mm) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: anzahl = 31; break; case 4: case 6: case 9: case 11: anzahl = 30; break; case 2: if( schaltJahr) anzahl = 29; else anzahl = 28; } if( tt < 1 || tt > anzahl) return false; // Tag tag = tt; berechneWochenTag(); return true; // Datum korrekt } /** * Berechne Wochentag nach W. Jacobsthal (1917). * Ausgangsdatum der Berechnung: Sonntag, 1.5.1600 */ private void berechneWochenTag() { int korrektur = 0; // Korrekturtage switch( monat) { case 1: korrektur = schaltJahr? 5 : 6; break; case 2: korrektur = schaltJahr? 1 : 2 ; break; case 3: korrektur = 2; break; case 4: korrektur = 5; break; case 5: korrektur = 0; break; case 6: korrektur = 3; break; case 7: korrektur = 5; break; case 8: korrektur = 1; break; case 9: korrektur = 4; break; case 10: korrektur = 6 ; break; case 11: korrektur = 2 ; break; case 12: korrektur = 4 ; break; } int cc = jahr / 100; // Schaltjahr int jj = jahr % 100; int korrekturTage = tag + korrektur + jj + jj / 4 - 2 * ( cc % 4); switch( korrekturTage % 7) // Wochentag { case 0: wochenTag = "Sonntag"; break; case 1: wochenTag = "Montag"; break; case 2: wochenTag = "Dienstag"; break; case 3: wochenTag = "Mittwoch"; break; case 4: wochenTag = "Donnerstag"; break; case 5: wochenTag = "Freitag"; break; case 6: wochenTag = "Samstag"; break; } } /* ------------------------------------------------- */ // toString /** * Datum als String "Wochentag, den tt.mm.ccjj". * @return Datum */ public String toString() { return wochenTag + ", den " + tag + ". " + monat + ". " + jahr; } }