Post by Stefan RamEs ist nicht ganz eindeutig, ob diese Lücke Teil des
(vorausgenommenen) gregorianischen Kalenders ist - jedenfalls,
"Before the Gregorian cutover, GregorianCalendar implements
the Julian calendar."
Zumindest ist eindeutig, daß die Klasse diese Lücke behandelt:
This implementation handles a single discontinuity, which corresponds
by default to the date the Gregorian calendar was instituted (October
15, 1582 in some countries, later in others). The cutover date may be
changed by the caller by calling setGregorianChange()
Man kann also sogar setzen, wann die Lücke war. Außerdem beeinflusst
dieses Datum das Verhalten der Schaltjahrberechung, da beim Julianischen
Kalender nur alle 4 Jahre ein Schaltjahr ist.
Post by Stefan RamMan kann "-1" als Darstellung von "1 vor Christus" (dem Jahr,
welches "1 nach Christus" direkt vorangeht) ansehen. (Was
natürlich nicht ganz stimmig ist, denn vor "1 nach Christus"
käme ja nach unserer heutigen Auffassung "0 vor Christus".)
Mit dem Auslassen der 0 verwendet man ja ohnehin nicht mehr
die Menge Z der ganzen Zahlen mit den üblichen Strukturen.
ja, so habe ich es auch in meiner Klasse festgelegt. Hier eine
abgespeckte Version, die nur die Differenz zwischen zwei Daten berechnet:
import java.util.*;
public class DayDiff {
public static int getDays(int year, int month, int date) {
long millisPerDay = 24 * 60 * 60 * 1000;
GregorianCalendar c =
new GregorianCalendar(TimeZone.getTimeZone("UTC"));
c.clear();
if (year < 0) {
c.set(Calendar.ERA, GregorianCalendar.BC);
year = -year;
}
c.set(year, month - 1, date);
return (int) (c.getTimeInMillis() / millisPerDay);
}
public static int diff(
int y1, int m1, int d1,
int y2, int m2, int d2)
{
return getDays(y1, m1, d1) - getDays(y2, m2, d2);
}
public static void main(String args[]) {
assert diff(-1, 1, 1, -2, 1, 1) == 365;
assert diff( 1, 1, 1, -1, 1, 1) == 366;
assert diff( 1, 1, 1, 0, 1, 1) == 366;
assert diff( 2, 1, 1, 1, 1, 1) == 365;
assert diff(1582, 10, 4, 1582, 10, 3) == 1;
assert diff(1582, 10, 15, 1582, 10, 4) == 1;
assert diff(1582, 10, 16, 1582, 10, 14) == -8;
assert diff(1582, 10, 16, 1582, 10, 15) == 1;
}
}
Genaugenommen müsste man bei der Jahreszahl 0 eine Exepction werfen.
Ebenso bei Daten zwischen dem 4.10.1582 und 15.10.1582, da es diese Daten
nicht gab und es sonst zu merkwürdigen Effekten kommt, z.B. daß
16.10.1582 - 14.10.1582 = -8 ergibt. Was übrigens auch ein Grund für die
spätere Einführung mancherorts war, da den Leuten ja 10 Tage ihres Lebens
gestohlen wurde :-)
http://www.geocities.com/CapitolHill/Lobby/2554/kal5.htm (Abschnitt "Die
Ausbreitung des Gregorianischen Kalenders")
In dBase (Clipper-Dialekt) konnte man übrigens einfach sowas schreiben:
. ? date() - { 1.1.2004 }
248
Schön, daß Java einem das Leben so leicht macht :-)
--
Frank Buß, ***@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de