001    package de.hska.info1.uebung.methoden;
002    
003    /**
004     * Datum stellt Methoden zur Überprüfung von Eigenschaften eines Datums des 
005     * Gregorianischen Kalenders zur Verfügung, wie etwa Überprüfen Schaltjahr, Anzahl
006     * Tag eines Monats in einem Jahr usw.
007     * <p>
008     * Tag, Monate und Jahr werde als Zahlwerte vom Typ int codiert.
009     * <ul>
010     *   <li>Tag: von 1 bis 31</li>
011     *   <li>Monat von 1 bis 12 (=Dezember)</li>
012     * </ul>
013     * 
014     * @author Christian Pape
015     */
016    public class Datum {
017    
018        /**
019         * Gibt true zurück, wenn das gegeben jahr ein Schaltjahr ist und
020         * false sonst. Ein Jahr ist ein Schaltjahr, wenn es durch 4 teilbar ist,
021         * es sei denn es ist durch 100 teilbar und nicht zusätzlich durch 400 teilbar.
022         * Beispiele:
023         * <ul>
024         *   <li>1904 ist ein Schaltjahr, da durch 4 aber nicht durch 100 teilbar</li>
025         *   <li>1900 ist kein Schaltjahr, da durch 100 teilbar aber nicht durch 400</li>
026         *   <li>2000 ist ein Schaltjahr, da zwar durch 100 teilbar aber auch durch 400</li>
027         * </ul>
028         * 
029         * @param jahr das zu überprüfende Schaltjahr
030         * 
031         * @return true, falls jahr ein Schaltjahr ist.
032         */
033        public static boolean schaltjahrUeberpruefen(int jahr) {
034            return jahr % 4 == 0 && (jahr % 100 != 0 || jahr % 400 == 0); 
035        }
036        
037        /**
038         * Gibt true zurück, wenn tag eine korrekte Anzahl Tag im gegebenen
039         * monat im jahr des Gregorianischen Kalenders darstellt und false sonst.
040         *
041         * @param tag der Tag im Monat (von 1 bis 31)
042         * @param monat der Monat im Jahr (von 1=jan bis 12=Dezember)
043         * @param jahr das jahr 
044         * 
045         * @return true, wenn tag eine korrekte Anzahl Tag im gegebenen
046         *            monat im jahr darstellt
047         */
048        public static boolean anzahlTageImMonatUeberpruefen(int tag, int monat, int jahr) {
049            if ( monat == 1 || monat == 3 || monat == 5 || monat == 7
050                     || monat == 8 || monat == 10 || monat == 12 ) {
051              return 1 <= tag && tag <= 31;
052            } else if ( monat == 2 ) {
053                if (schaltjahrUeberpruefen(jahr)) {
054                  return 1 <= tag && tag <= 29;
055                } else {
056                  return 1 <= tag && tag <= 28;
057                }
058            } else  {
059                return (1 <= monat && monat <= 12) && (1 <= tag && tag <= 30);
060            }        
061        }
062    
063        /**
064         * Gibt true zurück, wenn das gegeben Datum (tag, monat, jahr) ein
065         * gültiges Datum im Gregorianischen Kalender darstellt und false sonst.
066         * 
067         * @param tag  der Tag im Monat (von 1 bis 31)
068         * @param monat der Monat im Jahr (1=Jan bis 12=Dez)
069         * @param jahr  das Jahr (muss positiv sein)
070         * @return true, wenn das gegebene Datum (tag, monat, jahr) ein
071         *          gültiges Datum im Gregoriansichen Kalender darstellt
072         */
073        public static boolean pruefeDatum(int tag, int monat, int jahr) {
074            return (jahr > 0 && 1 <= monat && monat <= 12)
075                      && anzahlTageImMonatUeberpruefen(tag, monat, jahr);
076        }
077    }