2017-03-22 3 views
1

Etwas scheint nicht richtig und ich weiß nur nicht, wie ich es beheben kann.Anderes Zeitintervall util.date und DAYS.between (Localtime)

Ich möchte den Unterschied in Tagen zwischen 2 Daten wissen. Nun implementiert ich eine Funktion, die die Unterschiede von Millisekunden bis zu Tagen berechnet für util.date Objekte

public long calculateNumberOfDays(Date from, Date to) { 
    return (to.getTime() - from.getTime())/(1000*60*60*24); 
} 

Mein jUnit Test mir gesagt, ein Fehler mit dieser Funktion war, so dass ich schrieb es LOCALDATE und die ChronoUnit verwenden. DAYS.between Funktion. Es hat wie ein Zauber funktioniert.

Wollen wissen, was die Unterschiede zwischen diesen beiden Funktionen waren, schrieb ich diesen kleinen Test:

for(int numberDays = 1; numberDays<10; numberDays++){ 
     LocalDate fromLD = LocalDate.now(); 
     LocalDate toLD = fromLD.plusDays(numberDays); 
     Date fromD = Date.valueOf(fromLD); 
     Date toD = Date.valueOf(toLD); 
     long diffMS = toD.getTime() - fromD.getTime(); 
     double diffDays = diffMS/(1000*60*60*24); 
     long numDaysDate = DAYS.between(fromLD, toLD); 
     System.out.println(numberDays+" = "+diffDays+"/"+numDaysDate); 
} 

Es ist in der folgenden Ausgabe ergab:

1 = 1.0/1 
2 = 2.0/2 
3 = 3.0/3 
4 = 4.0/4 
5 = 4.0/5 
6 = 5.0/6 
7 = 6.0/7 
8 = 7.0/8 
9 = 8.0/9 

Kann mir jemand erklären, wie Das ist möglich? (1-4 funktioniert, 5-9 util.date hat einen Tag verloren)

+0

Sieht aus wie die Sommerzeit zu beginnen .... –

+0

ich nicht wissen wir sparen einen ganzen Tag dieses Jahr: P – Nexxurs

+0

Ich machte es eine Antwort, aber ganzzahlige (oder lange) Divisionen runden –

Antwort

3

Termine sind hart. Ein Java Date ist ein Datum und eine Uhrzeit. Wenn Sie es also auf ein tatsächliches Datum setzen, bedeutet dies Mitternacht an diesem Datum.

Die Sommerzeit beginnt jeden Tag (zumindest hier), also ist Mitternacht am Montag 23 Stunden nach Mitternacht am Sonntag.

Dividing ganzen Zahlen abrundet, so 4 Tage und 23 Stunden beträgt 4 Tage

das Ergebnis einer Integer-Division zu einem Doppel Casting ist zu spät; Sie müssen entweder eine oder beide der Eingänge werfen:

double diffDays = diffMS/(1000*60*60*24); 

4,0

double diffDays = diffMS/(1000.0*60*60*24); 

4,958333 ...

+0

Sie haben Recht, danke. Ich dachte, ich hätte das abgedeckt, indem ich diffDays zu einem doppelten Wert gemacht hätte. Wenn ich diffMS analysiere, um zu verdoppeln und dann zu teilen, werden die korrekten doppelten Werte erzeugt. – Nexxurs

+0

Wenn ich sage, dass Daten hart sind, meine ich * lächerlich * schwer, Datum/Zeit-Manipulation zu machen, ohne diese Art von Fehler zu treffen. Es gibt einen Grund, warum Java 8 einen dritten Versuch enthält (nach java.util.Date und java.util.Calendar), um die Tools bereitzustellen. Du hast Glück, dass du das in der Woche vor der Sommerzeit getestet hast. –