La guía o código que verás en este artículo es la solución más fácil y válida que encontramos a tu duda o problema.
Solución:
Encontré que la mejor manera de hacer esto es con CronoUnidad.
long minutes = ChronoUnit.MINUTES.between(fromDate, toDate);
long hours = ChronoUnit.HOURS.between(fromDate, toDate);
Hay documentación adicional aquí: https://docs.oracle.com/javase/tutorial/datetime/iso/period.html
Desafortunadamente, no parece haber una clase de período que también abarque el tiempo, por lo que es posible que deba hacer los cálculos por su cuenta.
Afortunadamente, las clases de fecha y hora tienen muchos métodos de utilidad que simplifican eso hasta cierto punto. Aquí hay una forma de calcular la diferencia, aunque no necesariamente la más rápida:
LocalDateTime fromDateTime = LocalDateTime.of(1984, 12, 16, 7, 45, 55);
LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 10, 6, 40, 45);
LocalDateTime tempDateTime = LocalDateTime.from( fromDateTime );
long years = tempDateTime.until( toDateTime, ChronoUnit.YEARS );
tempDateTime = tempDateTime.plusYears( years );
long months = tempDateTime.until( toDateTime, ChronoUnit.MONTHS );
tempDateTime = tempDateTime.plusMonths( months );
long days = tempDateTime.until( toDateTime, ChronoUnit.DAYS );
tempDateTime = tempDateTime.plusDays( days );
long hours = tempDateTime.until( toDateTime, ChronoUnit.HOURS );
tempDateTime = tempDateTime.plusHours( hours );
long minutes = tempDateTime.until( toDateTime, ChronoUnit.MINUTES );
tempDateTime = tempDateTime.plusMinutes( minutes );
long seconds = tempDateTime.until( toDateTime, ChronoUnit.SECONDS );
System.out.println( years + " years " +
months + " months " +
days + " days " +
hours + " hours " +
minutes + " minutes " +
seconds + " seconds.");
//prints: 29 years 8 months 24 days 22 hours 54 minutes 50 seconds.
La idea básica es esta: crear una fecha de inicio temporal y obtener los años completos hasta el final. Luego ajuste esa fecha por la cantidad de años para que la fecha de inicio sea menos de un año desde el final. Repita eso para cada unidad de tiempo en orden descendente.
Finalmente un descargo de responsabilidad: No tomé en cuenta las diferentes zonas horarias (ambas fechas deben estar en la misma zona horaria) y tampoco probé/verifiqué cómo el horario de verano u otros cambios en un calendario (como los cambios de zona horaria en Samoa) afectan este cálculo . Así que úsalo con cuidado.
¡Debería ser más simple!
Duration.between(startLocalDateTime, endLocalDateTime).toMillis();
Puede convertir milis a cualquier unidad que desee:
String.format("%d minutes %d seconds",
TimeUnit.MILLISECONDS.toMinutes(millis),
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));