TimeUnit.DAYS.convert(
Math.abs(
new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("30-03-2020 00:00:00").getTime() -
new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("1-03-2020 00:00:00").getTime()
),
TimeUnit.MILLISECONDS)
El resultado es 28, mientras que debería ser 29.
¿Podría la zona horaria / ubicación ser el problema?
SimpleDateFormat
más, ya que está obsoleto. Use paquetes de en sujava.time
lugar. EnSimpleDateFormat
el caso de, usoDateTimeFormatter
. En el caso de Java 7, vea el comentario de Andy Turner a continuación.java.time
[aunque noto que está en Java 7], ThreeTenBp , Joda).TimeUnit
no pretende saber nada sobre el horario de verano. Como dice el javadoc: un nanosegundo se define como una milésima de microsegundo, un microsegundo como una milésima de milisegundo, un milisegundo como una milésima de segundo, un minuto como sesenta segundos, una hora como sesenta minutos y un día como veinticuatro horas . --- Dado que el horario de verano hace que 2 días del año no sean exactamente 24 horas,TimeUnit
se equivoca cuando está involucrado el horario de verano.Respuestas:
El problema es que debido al cambio de horario de verano (el domingo 8 de marzo de 2020), hay 28 días y 23 horas entre esas fechas.
TimeUnit.DAYS.convert(...)
trunca el resultado a 28 días.Para ver el problema (estoy en la zona horaria del este de EE. UU.):
Salida
Para solucionarlo, use una zona horaria que no tenga horario de verano, por ejemplo, UTC :
Salida
fuente
GregorianCalendar
objeto y agregar 1 día a la vez hasta llegar a la fecha de finalización. Pagaría un alto precio para evitar eso. Y agregar el backport de una biblioteca que ya es parte de Java 8, 9, 10, 11, 12, 13, ... no tiene un precio alto. Por el contrario, la próxima vez que necesite hacer algo con fecha u hora, ya será una ganancia.La causa de este problema ya se menciona en la respuesta de Andreas .
La pregunta es qué es exactamente lo que quieres contar. El hecho de que declare que la diferencia real debe ser 29 en lugar de 28, y pregunte si "la hora de ubicación / zona podría ser un problema" , revela lo que realmente quiere contar. Aparentemente, desea deshacerse de cualquier diferencia de zona horaria.
Supongo que solo desea calcular los días, sin hora ni zona horaria.
Java 8
A continuación, en el ejemplo de cómo se puede calcular correctamente el número de días entre cada uno, estoy usando una clase que representa exactamente eso, una fecha sin hora ni zona horaria
LocalDate
.Tenga en cuenta que
ChronoUnit
,DateTimeFormatter
yLocalDate
requiere al menos Java 8, que no está disponible para usted, de acuerdo con la etiqueta java-7 . Sin embargo, tal vez sea para futuros lectores.Según lo mencionado por Ole VV, también está ThreeTen Backport , que soporta la funcionalidad de API de fecha y hora de Java 8 a Java 6 y 7.
fuente
ThreeTen
;-), pero desafortunadamente está fuera de línea al momento de escribir.) Actualizaré la publicación.java.time
, porque en la escuela todavía usan las viejas clases. Pero la API de fecha y hora de Java 8 está muy bien diseñada, sería una pérdida no usarla.