Java годы между 2 инстансами

В Joda мы можем рассчитать годы между 2 Datetime, используя

Years.between(dateTime1, dateTime2);

Есть ли простой способ найти годы между двумя моментами, используя java.time API вместо этого без особой логики?

ChronoUnit.YEARS.between(instant1, instant2)

терпит неудачу:

Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Years
        at java.time.Instant.until(Instant.java:1157)
        at java.time.temporal.ChronoUnit.between(ChronoUnit.java:272)
        ...

1 ответ

Решение

Число лет между двумя моментами считается неопределенным (по-видимому - я был удивлен этим), но вы можете легко преобразовать моменты в ZonedDateTime и получить полезный результат:

Instant now = Instant.now();
Instant ago = Instant.ofEpochSecond(1234567890L);

System.out.println(ChronoUnit.YEARS.between(
  ago.atZone(ZoneId.systemDefault()),
  now.atZone(ZoneId.systemDefault())));

Печать:

8

Я подозреваю, что причина, по которой вы не можете напрямую сравнивать моменты, состоит в том, что местоположение границы года зависит от часового пояса. Это означает, что ZoneId.systemDefault() может быть не то, что вы хотите! ZoneOffset.UTC было бы разумным выбором, в противном случае, если есть часовой пояс, который является более значимым в вашем контексте (например, часовой пояс пользователя, который увидит результат), вы бы хотели использовать его.

Другие вопросы по тегам