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.");
}
}