tl; dr
java.time.temporal.ChronoUnit.DAYS.between(
earlier.truncatedTo(ChronoUnit.DAYS) ,
later.truncatedTo(ChronoUnit.DAYS)
)
... o ...
java.time.temporal.ChronoUnit.HOURS.between(
earlier.truncatedTo(ChronoUnit.HOURS) ,
later.truncatedTo(ChronoUnit.HOURS)
)
java.time
FYI, el proyecto se encuentra ahora en Joda-Timemaintenance mode, con el equipo de asesoramiento migración a las clases java.time .
El equivalente de Joda-Time DateTime
es ZonedDateTime
.
ZoneId z = ZoneId.of("Pacific/Auckland") ;
ZonedDateTime now = ZonedDateTime.now(z) ;
Al parecer desea contar los días de las fechas, lo que significa que quiere hacer caso omiso de la hora del día. Por ejemplo, comenzar un minuto antes de la medianoche y finalizar un minuto después de la medianoche debería resultar en un solo día. Para este comportamiento, extraiga un LocalDate
de su ZonedDateTime
. La clase LocalDate
representa un valor de solo fecha sin hora del día y sin zona horaria.
LocalDate localDateStart = zdtStart.toLocalDate() ;
LocalDate localDateStop = zdtStop.toLocalDate() ;
Utilice la enumeración ChronoUnit
para el cálculo de días transcurridos u otras unidades.
long days = ChronoUnit.DAYS.between(localDateStart , localDateStop) ;
Truncar
En cuanto a usted preguntando acerca de una forma más general para hacer esto conteo en el que está interesado el delta de horas como hora-de-la-reloj en lugar de horas completas como vanos-de- tiempo de sesenta minutos, use el método truncatedTo
.
Aquí está su ejemplo de 14:45 a 15:12 en el mismo día.
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));
Para un recuento de días por fechas, truncadas a ChronoUnit.DAYS
. Aquí hay un ejemplo que pasa de la medianoche de cinco minutos antes a cinco minutos después, para los días transcurridos de 1
.
ZoneId z = ZoneId.of("America/Montreal");
ZonedDateTime start = ZonedDateTime.of(2017 , 1 , 17 , 23 , 55 , 0 , 0 , z);
ZonedDateTime stop = ZonedDateTime.of(2017 , 1 , 18 , 00 , 05 , 0 , 0 , z);
long days = ChronoUnit.DAYS.between(start.truncatedTo(ChronoUnit.DAYS) , stop.truncatedTo(ChronoUnit.DAYS));
Sobre java.time
El marco java.time está incorporado en Java 8 y versiones posteriores. Estas clases suplantan a las viejas y problemáticas clases de fecha y hora legacy, como java.util.Date
, Calendar
, & SimpleDateFormat
.
El proyecto Joda-Time, ahora en maintenance mode, recomienda la migración a las clases java.time.
Para obtener más información, consulte el Oracle Tutorial. Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310.
¿Dónde obtener las clases java.time?
- Java SE 8, Java SE 9, y más tarde
- incorporado.
- Parte de la API estándar de Java con una implementación integrada.
- Java 9 agrega algunas características menores y correcciones.
- Java SE 6 y Java SE 7
- Gran parte de la funcionalidad de back-java.time está portado a Java 6 & 7 en ThreeTen-Backport.
- Android
El proyecto se extiende ThreeTen-Extra java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval
, YearWeek
, YearQuarter
y more.
Puede proporcionar un caso de ejemplo con datos específicos en los que piense ['Days.daysBetween'] (http://www.joda.org/joda-time/apidocs/org/joda/time/Days.html#daysBetween-org .joda.time.ReadableInstant-org.joda.time.ReadableInstant-) es incorrecto? –
@BasilBourque - El ejemplo ya está en mi respuesta. –
Cuando dice usar 'Instant', no solo está hablando de' start.toInstant() ', ¿verdad? –