Frage

Ich habe versucht zu tun Datum einstellen Wert auf eine PreparedStatement mit default-Wert, sondern der Wert wird manchmal zurück, wie eine JulianValue.Zum Beispiel (Angenommen, spanBegin und spanEnd sind null)

Calendar cal = new GregorianCalendar();
if (spanBegin == null) {
    cal.set(0000, Calendar.JANUARY, 1);
    spanBegin = cal.getTime();
}

if (spanEnd == null)
{
    cal.set(9999, Calendar.DECEMBER, 31);
    spanEnd = cal.getTime();
}

Auf Linie 3, da das Datum Januar 1, 0000 bezieht, die von einem julianischen Kalender, den CDate wird julianischen Kalender.Jedoch, der nächste Termin, auch wenn es im Jahr 9999, seine CDate wird julianischen Kalender noch.Ich hatte so erstellen Sie eine weitere Instanz des Gregorianischen Kalenders, um das Problem zu beheben.

Calendar cal = new GregorianCalendar();
if (spanBegin == null) {
    cal.set(0000, Calendar.JANUARY, 1);
    spanBegin = cal.getTime();
}

Calendar cal = new GregorianCalendar();
if (spanEnd == null)
{
    cal.set(9999, Calendar.DECEMBER, 31);
    spanEnd = cal.getTime();
}

Die Frage ist, ist dies ein erwartetes Verhalten oder ein bug auf das date-Objekt?Tatsächlich GregorianCalendar.getInstance() zeigt, dass die cdate ist manchmal zu JulianCalendar.

War es hilfreich?

Lösung

Welche Java-version Sie verwenden und auf welchem Betriebssystem?Brauchen Sie wirklich zum speichern von Daten in den Jahren 0 und 9999, oder sind Sie nur mit diesen "negativ unendlich" und "Plus unendlich" Werte?Wie genau, sehen Sie, dass der Kalender Julian Kalender?

Ich versuchte dies:

Calendar cal = Calendar.getInstance();

cal.set(0, Calendar.JANUARY, 1);
Date d1 = cal.getTime();

cal.set(9999, Calendar.DECEMBER, 31);
Date d2 = cal.getTime();

System.out.println(d1);
System.out.println(d2);

Ausgabe (unter Windows XP Sun Java 1.6.0_16):

Thu Jan 01 09:53:56 CET 1 java.util.Date
Tue Dec 31 09:53:56 CET 9999 java.util.Date

Es verpasst dem Jahr 0 bis Jahr 1.Ändern Sie den code, einen zweiten Kalender-Objekt für das zweite Datum:

Calendar cal = Calendar.getInstance();

cal.set(0, Calendar.JANUARY, 1);
Date d1 = cal.getTime();

Calendar cal2 = Calendar.getInstance();
cal2.set(9999, Calendar.DECEMBER, 31);
Date d2 = cal2.getTime();

System.out.println(d1);
System.out.println(d2);

Dies ändert nichts an den Ausgang oder den Inhalt von zwei Date Objekte.

Hinweis:Beachten Sie, dass integer-Literale beginnen mit einer 0, wie 0000 in Ihrem code wird interpretiert als oktale zahlen, die von Java compiler.Das ist egal in diesem Fall, weil die Zahl 0 ist, aber Sie sollten nicht voran, Ganzzahl-Literale, die mit Nullen, wenn Sie nicht bedeuten, Sie als oktale zahlen.

Andere Tipps

Es wurde keine gregorianischen Kalender bis 1582. Der julianische Kalender in Gebrauch in ganz Europa war, bis kleinere Probleme begannen durch die Tatsache verursacht erscheinen das Sonnenjahr 365,25 Tage nicht genau, aber etwas weniger als das. Um zu beheben Dinge, ordnete Papst Gregor XIII den Kalender zu ändern, was wir heute wissen - jedes Jahr, dass dividiert durch 100 kein Schaltjahr ist, wenn es nicht von 400. Im Oktober 1582 teilt sich den Übergang war - am Tag nach 4 Oktober war 15 Diese Mittel Oktober, dass der Gregorian und Julian Kalender bis Oktober 1582 ist die gleiche. Sie können mehr darüber lesen hier

Aus diesem Grunde Datumsangaben vor 1582 Oktober konvertieren das Julian-System zu verwenden. Nach dem API Wenn Sie wirklich brauchen zu repräsentieren ein historisches Ereignis (die nicht hier durch den Fall scheint) Sie es ab 1. März nur tun können, 4AD

Thhere ist kein Jahr 0 in julianischen Kalender. Es geht von 1 bis BC 1 AD.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top