¿Cómo encuentro la diferencia en días entre dos instancias de Joda-Time DateTime
? Con "diferencia en días" quiero decir que si el inicio es el lunes y el final es el martes, espero un valor de retorno de 1 independientemente de la hora / minuto / segundo de las fechas de inicio y finalización.
Days.daysBetween(start, end).getDays()
me da 0 si el inicio es por la tarde y termina por la mañana.
También tengo el mismo problema con otros campos de fecha, así que esperaba que hubiera una forma genérica de "ignorar" los campos de menor importancia.
En otras palabras, los meses entre febrero y 4 de marzo también serían 1, al igual que las horas entre las 14:45 y las 15:12. Sin embargo, la diferencia horaria entre las 14:01 y las 14:55 sería 0.
Days.daysBetween
es incorrecto?Instant
, no solo estás hablandostart.toInstant()
, ¿verdad?Days
ClaseUsar la
Days
clase con elwithTimeAtStartOfDay
método debería funcionar:fuente
toDateMidnight()
del tipo DateTime está en desuso.end
pasa si es anterior alstart
, devuelve días negativos?puedes usar
LocalDate
:fuente
toDateMidnight()
del tipo DateTime está en desuso.new LocalDate(date)
másdate.toLocalDate()
?tl; dr
…o…
java.time
Para su información, el proyecto Joda-Time ahora está en modo de mantenimiento , y el equipo aconseja migrar a las clases java.time .
El equivalente de Joda-Time
DateTime
esZonedDateTime
.Aparentemente desea contar los días por fechas, lo que significa que desea ignorar la hora del día. Por ejemplo, comenzar un minuto antes de la medianoche y terminar un minuto después de la medianoche debería dar como resultado un solo día. Para este comportamiento, extraiga un
LocalDate
de suZonedDateTime
. LaLocalDate
clase representa un valor de solo fecha sin hora del día y sin zona horaria.Use la
ChronoUnit
enumeración para calcular los días transcurridos u otras unidades.Truncar
En cuanto a preguntar por una forma más general de hacer este recuento cuando le interesa el delta de horas como la hora del reloj en lugar de las horas completas como un período de tiempo de sesenta minutos, use el
truncatedTo
método.Aquí está su ejemplo de 14:45 a 15:12 el mismo día.
Esto no funciona por días. Use toLocalDate () en este caso.
Sobre java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como
java.util.Date
,Calendar
, ySimpleDateFormat
.El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No hay necesidad de cadenas, no hay necesidad de
java.sql.*
clases.¿Dónde obtener las clases java.time?
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como
Interval
,YearWeek
,YearQuarter
, y más .El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como
Interval
,YearWeek
,YearQuarter
, y más .fuente
La respuesta aceptada crea dos
LocalDate
objetos, que son bastante caros si está leyendo muchos datos. Yo uso esto:Al llamar
getMillis()
, utiliza variables ya existentes.MILLISECONDS.toDays()
luego, usa un cálculo aritmético simple, no crea ningún objeto.fuente
java.time.Period
Usa la
java.time.Period
clase para contar días .Como Java 8 calcular la diferencia es más intuitivo
LocalDate
,LocalDateTime
representa las dos fechasfuente
fuente
fuente