001    package de.hska.info1.uebung.objekte;
002    
003    /**
004     * Ein Datum im Gregorianischen Kalender
005     * bestehend aus Tag, Monat und Jahr.
006     * 
007     * @author Christian Pape
008     *
009     */
010    public class Datum {
011    
012        /**
013         * Tag im Monat (1..31)
014         */
015        private int tag; 
016        
017        /**
018         * Monat 1 = Jan, ..., 12 = Dez
019         */
020        private int monat;
021        
022        /**
023         * positive Zahl für das Jahr
024         */
025        private int jahr;
026        
027        public Datum(int tag, int monat, int jahr) {
028            this.tag = tag;
029            this.monat = monat;
030            this.jahr = jahr;
031        }
032    
033        /**
034         * Gibt genau dann <code>true</code> zurück, wenn das Jahr
035         * dieses Datums ein Schaltjahr ist.
036         */
037        public boolean isSchaltjahr() {
038            return jahr % 4 == 0 && jahr % 100 != 0 || jahr % 400 == 0;
039        }
040    
041        /**
042         * Gibt genau dann <code>true</code> zurück, wenn das Datum
043         * ein korrektes Datum im Gregorianischen Kalendar darstellt
044         * (tag, monat und jahr passen zusammen).
045         */
046        public boolean isKorrekt() {
047            if (jahr >= 0 && 0 < monat && monat <= 12 ) {
048                switch (monat) {
049                case 1:
050                case 3:
051                case 5:
052                case 7:
053                case 8:
054                case 10:
055                case 12: return 0 < tag && tag <= 31;            
056                case 2: if (isSchaltjahr()) {
057                            return 0 < tag && tag <= 29;
058                        } else {
059                            return 0 < tag && tag <= 28;
060                        }
061                case 4:
062                case 6:
063                case 9:
064                case 11: return 0 < tag && tag <= 30;
065                }
066            }
067            
068            return false;
069        }
070    
071        /**
072         * Gibt den Tag im Monat dieses Datums zurück (1,...,31).
073         * Falls das Datum nicht korrekt ist, wird -1 zurückgegeben.
074         */
075        public int getTag() {
076            if (isKorrekt()) {
077                return tag;
078            }
079            
080            return -1;
081        }
082    
083        /**
084         * Gibt den Monat dieses Datums zurück (1=Jan, ..., 12=Dez).
085         * Falls das Datum nicht korrekt ist, wird -1 zurückgegeben.
086         */
087        public int getMonat() {
088            if (isKorrekt()) {
089                return monat;
090            }
091            return -1;
092        }
093    
094        /**
095         * Gibt das Jahr dieses Datums zurück.
096         * Falls das Datum nicht korrekt ist, wird -1 zurückgegeben.
097         */
098        public int getJahr() {
099            if (isKorrekt()) {
100                return jahr;
101            }
102            return -1;
103        }
104    
105        /**
106         * Gibt das Datum im Format "1. Januar 2000 / Schaltjahr",
107         * bzw. "5. August 1999 / kein Schaltjahr"
108         * zurück. Falls das Datum nicht korrekt ist wird
109         * "ungültiges Datum" zurückgegeben.
110         */
111        public String toString() {
112            String datumString = "ungültiges Datum";
113            
114            if (isKorrekt()) {
115                datumString = tag + ". " + getMonatsName() + " " + jahr ;
116                if (isSchaltjahr()) {
117                    datumString += " / Schaltjahr";
118                } else {
119                    datumString += " / kein Schaltjahr";
120                }
121            }
122            return datumString;
123        }
124    
125        /**
126         * Gibt den Namen des Monats (in Deutsch) zurück.
127         * Falls das Datum nicht korrekt ist, wird "" zurückgegeben.
128         */
129        private String getMonatsName() {
130            if (isKorrekt()) {
131                switch (monat) {
132                case 1: return "Januar";
133                case 2: return "Februar";
134                case 3: return "März";
135                case 4: return "April";
136                case 5: return "Mai";
137                case 6: return "Juni";
138                case 7: return "Juli";
139                case 8: return "August";
140                case 9: return "September";
141                case 10: return "Oktober";
142                case 11: return "November";
143                case 12: return "Dezember";
144                }
145            }
146            
147            return "";
148        } 
149    }