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)
O resultado é 28, enquanto deve ser 29.
O fuso horário / local pode ser o problema?
SimpleDateFormat
mais, pois é obsoleto. Use pacotes dejava.time
vez. NoSimpleDateFormat
caso, useDateTimeFormatter
. No caso do Java 7, veja o comentário de Andy Turner abaixo.java.time
[embora eu note que você esteja no Java 7], ThreeTenBp , Joda).TimeUnit
não pretende saber nada sobre horário de verão. Como diz o javadoc: Um nanossegundo é definido como um milésimo de microssegundo, um microssegundo como um milésimo de um milissegundo, um milissegundo como um milésimo de segundo, um minuto como sessenta segundos, uma hora como sessenta segundos e um dia como vinte e quatro horas . --- Como o horário de verão faz com que dois dias do ano não sejam exatamente 24 horas,TimeUnit
ele erra quando o horário de verão está envolvido.Respostas:
O problema é que, devido ao horário de verão (no domingo, 8 de março de 2020), há 28 dias e 23 horas entre essas datas.
TimeUnit.DAYS.convert(...)
trunca o resultado para 28 dias.Para ver o problema (estou no fuso horário do leste dos EUA):
Resultado
Para corrigir, use um fuso horário que não tenha horário de verão, por exemplo, UTC :
Resultado
fonte
GregorianCalendar
objeto e adicionar 1 dia por vez até que a data final seja atingida. Eu pagaria um preço alto para evitar isso. E adicionar o backport de uma biblioteca que já faz parte do Java 8, 9, 10, 11, 12, 13, ... não é um preço alto. Pelo contrário, da próxima vez que você precisar fazer algo com data ou hora, já será um ganho.A causa desse problema já é mencionada na resposta de Andreas .
A questão é o que exatamente você deseja contar. O fato de você declarar que a diferença real deve ser 29 em vez de 28 e perguntar se "a hora do local / fuso horário pode ser um problema" revela o que você realmente deseja contar. Aparentemente, você quer se livrar de qualquer diferença de fuso horário.
Suponho que você só deseja calcular os dias, sem hora e fuso horário.
Java 8
Abaixo, no exemplo de como o número de dias entre eles pode ser calculado corretamente, estou usando uma classe que representa exatamente isso - uma data sem hora e fuso horário -
LocalDate
.Note-se que
ChronoUnit
,DateTimeFormatter
eLocalDate
exigem pelo menos Java 8, que não está disponível para você, de acordo com o java-7 tag. No entanto, talvez seja para futuros leitores.Conforme mencionado por Ole VV, também há o ThreeTen Backport , que suporta a funcionalidade da API de data e hora do Java 8 para Java 6 e 7.
fonte
ThreeTen
;-), mas infelizmente ele está offline no momento da escrita.) Atualizarei a postagem.java.time
, porque na escola elas ainda usam as classes antigas. Mas a API Java 8 Date and Time é muito bem projetada - seria uma perda não usá-la.