/ / Probleme mit dem Datum 31-12-9999 in Java - Java

Probleme mit dem Datum 31-12-9999 in Java - Java

Mein Programm muss dieses Datum als Java darstellen.sql.date-Objekt, aber es scheint, als würde ich ein neues Datum erstellen (unter Verwendung des Kalenders) und es auf "9999-12-31" setzen und dieses java.util.date-Objekt schließlich in ein java.sql.date-Objekt konvertieren Dieses Datum wird in etwas wie "000-01-31" umgewandelt.

Calendar calendar = Calendar.getInstance();
calendar.set(9999, 12, 31);
infinityDate = new java.sql.Date(normalizeDate(calendar.getTime()).getTime());

infinityDate sollte 31-12-9999 sein aber wenn mein code hier reicht:

if(otherDate.equals(infinityDate))
{// Do stuff}

Es geht nie in den if-Zustand, da das infinityDate aus irgendeinem Grund in 31-01-000 geändert wurde, auch wenn otherDate "31-12-9999" ist.

Die Tatsache, dass otherDate 31-12-9999 ist, sagt mirdieses java kann diese daten darstellen, aber wenn ich es unter Verwendung eines kalenders konstruiere, ändert sich das datum. (otherDate stammt von einer jdbc-Anweisung, die Daten aus einer Datenbank abruft.)

Dieses Bezugsdatum "31-12-9999" wurde festgelegtDies kann von keinem Client geändert werden, und mein Programm muss einige eingehende Datumswerte damit vergleichen können. Weiß jemand, warum das so ist, das ist mir klar http://en.wikipedia.org/wiki/Year_10,000_problem Für Datumsangaben nach dem Jahr 9999 ist dies möglicherweise ein Problem, aber ich sollte einen Tag sicher sein.

BEARBEITEN: Die Methode "Datum normalisieren" normalisiert nur "das angegebene Datum auf Mitternacht dieses Tages".

    private static java.util.Date normalizeDate(java.util.Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
date = calendar.getTime();

return date;
}

Dieses Problem erschien jedoch, bevor ich das Datum normalisierte. Ich normalisierte es, um dieses Problem zu beheben.

Antworten:

9 für die Antwort № 1

Monate sind null indiziert. Benutzen 11 für Dezember nicht 12. Deshalb rollen Sie das ganze Jahr über.


5 für die Antwort № 2

Calendar.MONTH ist nullbasiert. Der Anruf

calendar.set(9999, 12, 31);

setzt das Datum auf "den 31. Tag des 13. Monats des Jahres 9999", der implizit in den 1. Monat des Jahres 10000 umgewandelt wird. Wenn Sie das erste Mal anrufen, führt dies zu einer Ausnahme

calendar.setLenient(false);

0 für die Antwort № 3

Prüfen Sie die Stunden, Minuten, Sekunden und Millisekunden, die in diesen beiden Datumsobjekten enthalten sind. Ich glaube, dass sie anders sind.

Wenn Sie nur das Datum (Jahr, Monat, Tag) vergleichen möchten, sollten Sie wahrscheinlich Ihren benutzerdefinierten Wert erstellen Comparator und benutze es.