2015-10-02 43 views
5

Ho provato a calcolare la differenza tra due date e ho notato una cosa. Quando si calcolano solo i giorni, l'intervallo di ora legale è incluso nell'intervallo, quindi il risultato sarà più breve con 1 giorno.java.util.Date Calcolare la differenza in giorni

Per ottenere risultati accurati, è necessario considerare anche il valore delle ore.

Ad esempio:

SimpleDateFormat format = new SimpleDateFormat("MM-dd-yyyy"); 
Date dfrom = format.parse("03-29-2015"); 
Date dto = format.parse("03-30-2015"); 
long diff = dto.getTime() - dfrom.getTime(); 
System.out.println(diff); 
System.out.println("Days: "+diff/(24 * 60 * 60 * 1000)); 
System.out.println("Hours: "+diff/(60 * 60 * 1000) % 24); 

uscita:

82800000 
Days: 0 
Hours: 23 

Qualcuno ha una soluzione migliore?

+3

È possibile utilizzare java.time (Java 8) o Joda Time? Entrambi renderanno questo * molto * più semplice. –

+3

Possibile duplicato di [Calcolo della differenza tra due istanze di data Java] (http://stackoverflow.com/questions/1555262/calculating-the-difference-between-two-java-date-stance) – Tom

+2

La causa principale è la tua ipotesi nella riga 6 che ogni giorno ha 24 ore, quando sai già che l'intervallo che stai misurando contiene un giorno di sole 23 ore. –

risposta

9

Oh sì, la soluzione migliore è!

Interrompere l'utilizzo della classe obsoleta java.util.Date e sfruttare la potenza di java.time API integrata in Java 8 e versioni successive (tutorial). Nello specifico, le classi DateTimeFormatter, LocalDate e ChronoUnit.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd-yyyy"); 
LocalDate date1 = LocalDate.parse("03-29-2015", formatter); 
LocalDate date2 = LocalDate.parse("03-30-2015", formatter); 
long days = ChronoUnit.DAYS.between(date1, date2); 
System.out.println(days); // prints 1