Estou tentando calcular a diferença entre dois LocalDateTime
.
A saída precisa estar no formato y years m months d days h hours m minutes s seconds
. Aqui está o que eu escrevi:
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.ZoneId;
public class Main {
static final int MINUTES_PER_HOUR = 60;
static final int SECONDS_PER_MINUTE = 60;
static final int SECONDS_PER_HOUR = SECONDS_PER_MINUTE * MINUTES_PER_HOUR;
public static void main(String[] args) {
LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 9, 19, 46, 45);
LocalDateTime fromDateTime = LocalDateTime.of(1984, 12, 16, 7, 45, 55);
Period period = getPeriod(fromDateTime, toDateTime);
long time[] = getTime(fromDateTime, toDateTime);
System.out.println(period.getYears() + " years " +
period.getMonths() + " months " +
period.getDays() + " days " +
time[0] + " hours " +
time[1] + " minutes " +
time[2] + " seconds.");
}
private static Period getPeriod(LocalDateTime dob, LocalDateTime now) {
return Period.between(dob.toLocalDate(), now.toLocalDate());
}
private static long[] getTime(LocalDateTime dob, LocalDateTime now) {
LocalDateTime today = LocalDateTime.of(now.getYear(),
now.getMonthValue(), now.getDayOfMonth(), dob.getHour(), dob.getMinute(), dob.getSecond());
Duration duration = Duration.between(today, now);
long seconds = duration.getSeconds();
long hours = seconds / SECONDS_PER_HOUR;
long minutes = ((seconds % SECONDS_PER_HOUR) / SECONDS_PER_MINUTE);
long secs = (seconds % SECONDS_PER_MINUTE);
return new long[]{hours, minutes, secs};
}
}
A saída que estou recebendo é 29 years 8 months 24 days 12 hours 0 minutes 50 seconds
. Eu verifiquei meu resultado neste site (com valores 12/16/1984 07:45:55
e 09/09/2014 19:46:45
). A captura de tela a seguir mostra a saída:
Tenho certeza de que os campos após o valor do mês estão incorretos no meu código. Qualquer sugestão seria muito útil.
Atualizar
Testei meu resultado em outro site e o resultado obtido é diferente. Aqui está: Calcule a duração entre duas datas (resultado: 29 anos, 8 meses, 24 dias, 12 horas, 0 minutos e 50 segundos).
Atualizar
Como obtive dois resultados diferentes de dois sites diferentes, estou me perguntando se o algoritmo do meu cálculo é legítimo ou não. Se eu usar os seguintes dois LocalDateTime
objetos:
LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 10, 6, 40, 45);
LocalDateTime fromDateTime = LocalDateTime.of(1984, 12, 16, 7, 45, 55);
Então a saída está chegando: 29 years 8 months 25 days -1 hours -5 minutes -10 seconds.
A partir deste link deve ser 29 years 8 months 24 days 22 hours, 54 minutes and 50 seconds
. Portanto, o algoritmo também precisa lidar com os números negativos.
Observe que a pergunta não é sobre qual site me deu o resultado, preciso conhecer o algoritmo certo e ter os resultados certos.
7:45:55
e a hora de término 19:46:45
(ou 7:46:45
PM). Portanto, a diferença entre essas duas vezes é de 12 horas, 0 minutos e 50 segundos e nunca 23 horas, 34 minutos e 12 segundos. Portanto, seu cálculo atual parece estar correto, pelo menos na parte do tempo.
LocalDateTime
não possui fuso horário, pode não haver uma resposta única. Mesmo se você presumir que os fusos horários de início e término são os mesmos, em determinadas zonas como 09-09-2014 será no horário de verão ou no horário de verão e em outros não. Isso pode prejudicar as coisas em uma hora. Portanto, calcular a diferença para o segundo não faz sentido, a menos que isso seja resolvido.
LocalDateTime
gera resultados irreais, pois essa classe propositalmente não possui qualquer conceito de fuso horário ou deslocamento do UTC? Para valores realistas, atribua um fuso horário via ZoneId
a ser usado ZonedDateTime
.
Period.between()
aplicar alguns arredondamentos?