2016-04-25 14 views
1

Also müssen wir für eine Zuweisung die JDK-Datums- oder Kalender-Objekte verwenden, um Daten in dem System zu repräsentieren, das wir entwerfen (sonst würde ich eine andere Bibliothek verwenden). Für eine Funktion muss ich sicherstellen, dass mindestens eine bestimmte Anzahl von Jahren seit dem Eingabedatum bis zum heutigen Datum vergangen ist. Ich schrieb die folgende Methode die Tage zwischen zwei Kalender-Objekten, um zu versuchen und zu berechnen:Tage zwischen zwei Datums- oder Kalender-Objekten in Java berechnen

public static int daysSince(Calendar pastDate) { 
    Calendar presentDate = Calendar.getInstance(); 

    int daysSince = 0; 

    while (pastDate.before(presentDate)) { 
     pastDate.add(Calendar.DAY_OF_MONTH, 1); 
     daysSince++; 
    } return daysSince; 
} 

Dieses Verfahren ist jedoch immer genau 30 Tage weniger zurückzukehren scheint als die tatsächliche Anzahl der Tage zwischen den beiden Daten, und ich kann‘ t scheinen zu verstehen, warum? Zum Beispiel gibt es nur einen Tag zwischen dem 25.03.2016 und dem 25.04.2016. Was vermisse ich?

+0

Sehen Sie diese http://stackoverflow.com/questions/1555262/calculating-the-difference-between-two-java-date-instances –

Antwort

2

Ihr Code funktioniert meistens (proof). Ich vermute, dass deine Testdaten falsch sind.

Zum Beispiel gibt es nur einen Tag zwischen dem 25.03.2016 und dem 25.04.2016.

Ich vermute, Sie haben dieses Testdatum (25.03.2016) falsch erstellt. Denken Sie daran, dass MONTH Werte mit 0, beginnen so 2016.03.25 erstellen müssten Sie:

past.set(Calendar.DAY_OF_MONTH, 25); 
past.set(Calendar.MONTH, 2);   // NOTE THE 2 
past.set(Calendar.YEAR, 2016); 

Ich vermute, Sie 3 verwendet, wo Sie 2 benötigt, und die eines Tages war waren da Ihr Testdatum war um Mitternacht und Ihr aktuelles Datum war nicht.

Abgesehen davon, dass Sie wahrscheinlich mal besser umgehen wollen, funktioniert dieser Code.

+1

@ transiti0nary: Im Grunde ändert Fragen einmal sie beantwortet (oder offen schon vorher, da Menschen wahrscheinlich an Antworten arbeiten) ist es nicht angemessen auf SO; Fragen sind keine beweglichen Ziele. Wenn Sie eine neue Frage haben, stellen Sie eine neue Frage. Ich habe die Änderung rückgängig gemacht (Sie können den Inhalt [hier] (http://stackoverflow.com/posts/36837338/revisions) für die Erstellung Ihrer neuen Frage noch abrufen). –

0

Statt Looping, können Sie es wie folgt tun:

public static int daysSince(Calendar pastDate) { 
    Calendar presentDate = Calendar.getInstance(); 
    long millisInADay = 1000 * 60 * 60 * 24; 

    return(pastDate.getTimeInMillis()-presentDate.getTimeInMillis())/millisInADay; 
} 
+0

Sehen Sie [hier] (http://StackOverflow.com/a/3491711/157247), warum dies naiv ist, ist eine schlechte Idee. –

+0

Danke. Ich habe eine andere Implementierung produziert, die kein Looping beinhaltet, aber jetzt habe ich das Problem, Tage in Jahre umzurechnen, während ich das Schaltjahr in Betracht ziehe. Gibt es im JDK irgendeine Art von Konvertierungstool, ähnlich der TimeUnit-Enumeration, die ich in meiner Implementierung verwendet habe, um dies zu erreichen? Danke – transiti0nary

+0

Ich denke LocalDate wäre der beste Ansatz in diesem Fall. https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html –

-1

Vergewissern Sie sich während der letzten Datum einstellen, dass Monate 0-11 Form berücksichtigt werden.

Calendar presentDate = Calendar.getInstance(); //25th April, 2016 
    Calendar pastDate = Calendar.getInstance(); 
    pastDate.set(2016, 2, 25); //its 25th March, 2016 here 
    int daysSince = 0; 
    while(pastDate.before(presentDate)){ 
     pastDate.add(Calendar.DAY_OF_MONTH, 1); 
     daysSince++; 
    } 
    System.out.println(daysSince); 
//output : 31 
+0

Danke, ich habe einfach 0-Indizierung vergessen. Jedoch bin ich jetzt auf ein anderes Problem gestoßen, ich habe den ursprünglichen Beitrag, der es beschreibt, aktualisiert. – transiti0nary

Verwandte Themen