Calendar rechnet möglicherweise falsch

Status
Nicht offen für weitere Antworten.

heidiweber

Aktives Mitglied
Hallo,

ich muss aus Datumswerten die Anzahl der Tage berechnen.

Dies mache ich so:

Code:
String vonDat = "19800101";
String bisDat = "20600605";

Calendar vonDatCal = new GregorianCalendar(Integer.valueOf(vonDat.substring(0, 4)), Integer.valueOf(vonDat.substring(4, 6)), Integer.valueOf(vonDat.substring(6, 8))); 

Calendar bisDatCal = new GregorianCalendar(Integer.valueOf(bisDat.substring(0, 4)), Integer.valueOf(bisDat.substring(4, 6)), Integer.valueOf(bisDat.substring(6, 8))); 

                
long diffDays = (bisDatCal.getTimeInMillis()-vonDatCal.getTimeInMillis())/(24*60*60*1000); 

System.out.println(diffDays + 1);

Als Ausgabe kommt: "29375" Tage

Berechne ich die Anzahl der Tage mit Excel, kommt: "29377". Was meiner Meinung auch richtig ist, da ich vor Jahren selbst eine Funktion geschrieben habe, die die Anzahl der Tage berechnet (es sollten auch Schaltjahre berücksichtigt werden) und da kommt auch "29377" heraus.

Wäre Excel nicht von Microsoft, würde ich das Ergebnis auch 100%ig vertrauen🙂 Da aber meine Funktion auch dieses Ergebnis liefert, denke ich schon, dass dieser Wert korrekt ist. Gibt es irgendwo im Netz eine Seite, mit der man die Anzahl der Tage 1ßß% korrekt berechnen kann?

Falls der berechnete Wert aus Java nicht korrekt sein sollte (oder gibt es dafür eine plausible Erklärung), wie kann man sonst mit Java-Boardmitteln die Anzahl der Tage korrekt berechnen? Ist dies ein bekannter Bug in Java?

Vielen Dank schon mal
Grüße
Heidi
 
Der java-Calendar zählt Monate ab 0, so haste quasi falsche Monate eingegeben.
Code:
        String vonDat = "19800101";
        String bisDat = "20600605";

        Calendar vonDatCal = 
                new GregorianCalendar(
                Integer.valueOf(vonDat.substring(0, 4)), Integer.valueOf(vonDat.substring(4, 6))+1, Integer.valueOf(vonDat.substring(6, 8)));
        Calendar bisDatCal = 
                new GregorianCalendar(
                Integer.valueOf(bisDat.substring(0, 4)), Integer.valueOf(bisDat.substring(4, 6))+1, Integer.valueOf(bisDat.substring(6, 8)));
        long diffDays = (bisDatCal.getTimeInMillis() - vonDatCal.getTimeInMillis()) / (24 * 60 * 60 * 1000);

        System.out.println(diffDays + 1);
 
Vielen Dank - sowas muss man einfach wissen - völlig unlogisch aber naja - man sollte halt gleich in die API schauen.

Nur warum?

Der java-Calendar zählt Monate ab 0, so haste quasi falsche Monate eingegeben.

Aber du meintest doch sicher "-1" und nicht "+1"?

Vielen herzlichen Dank

Grüße
Heidi
 
jetzt mal mit Taschenrechner nachgerechnet.. es müssen 29377 Tage sein, vorausgesetzt, der Tag vom von-Datum gehört dazu.

So kommste auf 29376. Dir fehlt ein Tag, weil das bis-Datum auf 00:00 Uhr steht, denn später rechnest du mit millisekunden gefolgt von einer ganzzahligen division (long).
 
Das ist die Zukunft von Java.
Code:
import org.joda.time.DateTime;
import org.joda.time.Period;
import org.joda.time.PeriodType;

class UebungDays {

    public static void main(String[] args) {
        DateTime von = new DateTime(1980, 1, 1, 0, 0, 0, 0);
        DateTime bis = new DateTime(2060, 6, 5, 0, 0, 0, 0);
        Period p = new Period(von.getMillis(),  bis.getMillis(), PeriodType.days());
        System.out.println(p.getDays() + 1);
    }
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben