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 }