Estoy tratando de calcular la diferencia entre dos LocalDateTime
.
La salida debe ser del formato y years m months d days h hours m minutes s seconds
. Aquí está lo que he escrito:
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};
}
}
El resultado que estoy obteniendo es 29 years 8 months 24 days 12 hours 0 minutes 50 seconds
. He verificado mi resultado de este sitio web (con valores 12/16/1984 07:45:55
y 09/09/2014 19:46:45
). La siguiente captura de pantalla muestra el resultado:
Estoy bastante seguro de que los campos después del valor del mes salen mal de mi código. Cualquier sugerencia sería de gran ayuda.
Actualizar
He probado mi resultado de otro sitio web y el resultado que obtuve es diferente. Aquí está: Calcule la duración entre dos fechas (resultado: 29 años, 8 meses, 24 días, 12 horas, 0 minutos y 50 segundos).
Actualizar
Como obtuve dos resultados diferentes de dos sitios diferentes, me pregunto si el algoritmo de mi cálculo es legítimo o no. Si uso los siguientes dos LocalDateTime
objetos:
LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 10, 6, 40, 45);
LocalDateTime fromDateTime = LocalDateTime.of(1984, 12, 16, 7, 45, 55);
Entonces viene la salida: 29 years 8 months 25 days -1 hours -5 minutes -10 seconds.
Desde este enlace debería ser 29 years 8 months 24 days 22 hours, 54 minutes and 50 seconds
. Entonces el algoritmo también necesita manejar los números negativos.
Tenga en cuenta que la pregunta no es sobre qué sitio me dio qué resultado, necesito saber el algoritmo correcto y tener los resultados correctos.
7:45:55
y la hora de finalización 19:46:45
(o 7:46:45
PM). Entonces, la diferencia entre esos dos tiempos es de 12 horas, 0 minutos y 50 segundos y nunca 23 horas, 34 minutos y 12 segundos. Por lo tanto, su cálculo actual parece ser correcto, al menos en la parte del tiempo.
LocalDateTime
no tiene zona horaria, es posible que no haya una respuesta única. Incluso si asume que las zonas horarias de inicio y finalización son las mismas, en ciertas zonas las fechas como 2014-09-09 serán en horario de verano o en horario de verano y en otras no. Esto podría retrasar las cosas por una hora. Por lo tanto, calcular la diferencia con el segundo no tiene sentido a menos que esto se resuelva.
LocalDateTime
arroja resultados poco realistas, ya que esa clase carece deliberadamente de cualquier concepto de zona horaria o compensación desde UTC? Para valores realistas, asigne una zona horaria a través ZoneId
del uso ZonedDateTime
.
Period.between()
aplicar algún redondeo?