tl; dr
java.time.temporal.ChronoUnit.DAYS.between(
earlier.toLocalDate(),
later.toLocalDate()
)
…o…
java.time.temporal.ChronoUnit.HOURS.between(
earlier.truncatedTo( ChronoUnit.HOURS ) ,
later.truncatedTo( ChronoUnit.HOURS )
)
java.time
Cordiali saluti, il progetto Joda-Time è ora in modalità di manutenzione , con il team che consiglia la migrazione alle classi java.time .
L'equivalente di Joda-Time DateTime
è ZonedDateTime
.
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;
Apparentemente vuoi contare i giorni per data, il che significa che vuoi ignorare l'ora del giorno. Ad esempio, iniziare un minuto prima di mezzanotte e terminare un minuto dopo la mezzanotte dovrebbe tradursi in un solo giorno. Per questo comportamento, estrarre un LocalDate
dal tuo ZonedDateTime
. La LocalDate
classe rappresenta un valore di sola data senza ora del giorno e senza fuso orario.
LocalDate localDateStart = zdtStart.toLocalDate() ;
LocalDate localDateStop = zdtStop.toLocalDate() ;
Utilizzare l' ChronoUnit
enum per calcolare i giorni trascorsi o altre unità.
long days = ChronoUnit.DAYS.between( localDateStart , localDateStop ) ;
Troncare
Per quanto riguarda la tua domanda su un modo più generale di fare questo conteggio in cui sei interessato al delta di ore come ora piuttosto che ore complete come intervalli di tempo di sessanta minuti, usa il truncatedTo
metodo.
Ecco il tuo esempio da 14:45 a 15:12 nello stesso giorno.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime start = ZonedDateTime.of( 2017 , 1 , 17 , 14 , 45 , 0 , 0 , z );
ZonedDateTime stop = ZonedDateTime.of( 2017 , 1 , 17 , 15 , 12 , 0 , 0 , z );
long hours = ChronoUnit.HOURS.between( start.truncatedTo( ChronoUnit.HOURS ) , stop.truncatedTo( ChronoUnit.HOURS ) );
1
Questo non funziona per giorni. Utilizzare toLocalDate () in questo caso.
Informazioni su java.time
Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantare la vecchia fastidiosi legacy classi data-time come java.util.Date
, Calendar
, e SimpleDateFormat
.
Il progetto Joda-Time , ora in modalità manutenzione , consiglia la migrazione alle classi java.time .
Per saperne di più, consulta il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .
Puoi scambiare oggetti java.time direttamente con il tuo database. Utilizzare un driver JDBC conforme a JDBC 4.2 o successivo. Nessuna necessità di stringhe, nessuna necessità di java.sql.*
classi.
Dove ottenere le classi java.time?
Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili aggiunte future a java.time. Si possono trovare alcune classi utili, come per esempio Interval
, YearWeek
, YearQuarter
e altro .
Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili aggiunte future a java.time. Si possono trovare alcune classi utili, come per esempio Interval
, YearWeek
, YearQuarter
e altro .
Days.daysBetween
non siano corretti?