Datum.java

import java.io.*;

public class Datum {
  
  // Datenfelder
  
  private int tag;          // Werte von 1 bis 31
  private int monat;        // Werte von 1 bis 12
  private int jahr;         // Werte natürlich in voller Stellenzahl
  
  // Hilfsfelder
  
  // kleiner Trick: Dummy-Wert für 0, um direkt mit monat arbeiten zu können
  private String[] monatsName = {"", "Januar", "Februar", "März", "April",
  "Mai", "Juni", "Juli", "August", "September",
  "Oktober", "November", "Dezember"};
  
  private int[] monatsLänge = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  
  // Tage vom 1.1. bis zum 1. eines Monats
  private int[] monatstageSeitNeujahr = {-1, 0, 31, 59, 90, 120, 151,
                                   181, 212, 243, 273, 304, 334};

  private String[] tagesName = {"Montag", "Dienstag", "Mittwoch", 
                       "Donnerstag", "Freitag", "Samstag", "Sonntag"};

  
  public Datum(int t, int m, int j) {
    // gleich prüfen, bei Fehler Standardwerte (1.1.)
    // besser: Ausnahme auslösen
    
    jahr = j;
    
    if ((m >= 1) && (m <= 12)) {
      monat = m;
    } else {
      monat = 1;
    }
    
    if ((t >= 1) && (t <= monatsLänge(m, j))) {
      tag = t;
    } else {
      tag = 1;
    }
  }
  
  public String toString() {
    // Datum als String
    return tag + ". " + monatsName[monat] + " " + jahr;
  }
  
  public String wochentag() {
    // gibt den Wochentag des aktuellen Datums zurück
    return tagesName[tageSeitCG(this) % 7];
  }
  
  public Datum morgen() {
    if (tag + 1 <= monatsLänge(monat, jahr)) {     // gleicher Monat
      return new Datum(tag + 1, monat, jahr);
    } else if (monat + 1 <= 12) {             // Monatswechsel, gleiches Jahr
      return new Datum(1, monat + 1, jahr);
    } else {                                       // Jahreswechsel
      return new Datum(1, 1, jahr + 1);
    }
  }
  
  public Datum gestern() {
    if (tag >= 2 ) {     // gleicher Monat
      return new Datum(tag - 1, monat, jahr);
    } else if (monat >= 2) {             // Monatswechsel, gleiches Jahr
      return new Datum(monatsLänge(monat - 1, jahr), monat - 1, jahr);
    } else {                                       // Jahreswechsel
      return new Datum(31, 12, jahr - 1);
    }
  }
  
  public int tageAbstand(Datum d) {
    return tageSeitCG(d) - tageSeitCG(this);
  }
  
  
  private boolean istSchaltjahr(int j) {
       
    return (j % 4 == 0) && ((j % 100 != 0) || (j % 400 == 0));
  }
  
  private int monatsLänge(int m, int j) {
    // gibt Zahl der Tage des Monats m im Jahr j zurück
    
    if ((m == 2) && istSchaltjahr(j)) {
      return 29;
    } else {
      return monatsLänge[m];
    }
  }
  
  private int tageSeitCG(Datum d) {
    // Tage vom 1.1.1 bis zum Datum d
    // funktioniert so nur für positive Jahreszahlen
    // (eigentlich sogar erst seit der Gregorianischen Kalenderreform)
    
    int tageSeitNeujahr = monatstageSeitNeujahr[d.monat] + d.tag - 1;
    if (istSchaltjahr(d.jahr) && (d.monat > 2)) {
      tageSeitNeujahr++;
    }
    
    // berechne Schalttage vom Jahr 1 bis zum angegebenen Jahr
    //   (ausschliesslich dem Jahr selber)
    int schalttage = 0;
    for (int j = 1; j < d.jahr; j++) {
      if (istSchaltjahr(j)) {
        schalttage++;
      }
    }
    return 365*(d.jahr - 1) + schalttage + tageSeitNeujahr;
  }
  
  
  static public void main(String[] args) throws IOException {

    BufferedReader in = new BufferedReader(
                          new InputStreamReader(System.in));
    
    // hole heutiges Datum vom Benutzer
    String s;    // String für eingegebene Zeile
    System.out.println("Datum von heute eingeben");
    System.out.println("Tag:");
    s = in.readLine();
    int t = Integer.parseInt(s);
    System.out.println("Monat:");
    s = in.readLine();
    int m = Integer.parseInt(s);
    System.out.println("Jahr:");
    s = in.readLine();
    int j = Integer.parseInt(s);
    
    Datum heute = new Datum(t, m, j);
    System.out.println("Heute ist " + 
                           heute.wochentag() + ", der " + heute);
    
    System.out.println("Morgen ist der " + heute.morgen());
    System.out.println("Gestern war der " + heute.gestern());
    
    // hole weiteres Datum vom Benutzer
    System.out.println("weiteres Datum eingeben");
    System.out.println("Tag:");
    s = in.readLine();
    int t2 = Integer.parseInt(s);
    System.out.println("Monat:");
    s = in.readLine();
    int m2 = Integer.parseInt(s);
    System.out.println("Jahr:");
    s = in.readLine();
    int j2 = Integer.parseInt(s);
    
    Datum demnächst = new Datum(t2, m2, j2);
    
    System.out.println("Von " + heute + " bis " + demnächst + " sind es " +
    heute.tageAbstand(demnächst) + " Tage.");
    
  }
}