Java jsr310: разница между датами и временем

Существует множество вопросов SO, которые касаются вычисления разницы между двумя датами или двумя раз в Java. Многие ответы указывают на проблемы с основными классами Java Date и предлагают использовать Jodatime, но AFAIK, нет никого, кто предложит, как это сделать, используя jsr310.

Итак, существуют ли какие-либо методы для вычисления разницы между двумя датами или два раза в jsr310?


Для справки следующие вопросы относятся к этой проблеме:

В ядре Java:

В Jodatime:

Ответ 1

Как это сделать, зависит от того, какие даты или классы даты и времени используются.

Если вы работаете в режиме реального времени (т.е. с часовыми поясами и т.д., поэтому время datetime может быть точно определено с точностью Instant на линии времени), вы можете использовать класс Duration (javadoc) - например

Duration diff = Duration.between(InstantProvider startInc, InstantProvider endInc);

где InstantProvider способен

В качестве альтернативы, если вы работаете в гипотетическом времени (т.е. без часовых поясов и т.д.), вы можете использовать класс Period (javadoc), чтобы получить разницу между двумя экземплярами LocalDate - например

// diff in days, months and years:
Period diff = Period.between(LocalDate start, LocalDate end);

// diff in days:
Period diff = Period.daysBetween(LocalDate start, LocalDate end);

Однако я не знаю о каких-либо удобных методах для получения разницы между двумя LocalDateTimes или LocalTimes. Но... это можно сделать с помощью Period следующим образом:

// diff between LocalDateTimes:
public static Period between(LocalDateTime start, LocalDateTime end){
  return Period.of(
    end.getYear()-start.getYear(), 
    end.getMonthOfYear().getValue()-start.getMonthOfYear().getValue(), 
    end.getDayOfMonth()-start.getDayOfMonth(),
    end.getHourOfDay()-start.getHourOfDay(),
    end.getMinuteOfHour()-start.getMinuteOfHour(),
    end.getSecondOfMinute()-start.getSecondOfMinute(),
    end.getNanoOfSecond()-start.getNanoOfSecond()
  );
}

// diff between LocalTimes:
public static Period between(LocalTime start, LocalTime end){
  return Period.of(0, 0, 0,
    end.getHourOfDay()-start.getHourOfDay(),
    end.getMinuteOfHour()-start.getMinuteOfHour(),
    end.getSecondOfMinute()-start.getSecondOfMinute(),
    end.getNanoOfSecond()-start.getNanoOfSecond()
  );
}

Ответ 2

Ответ на окончательную версию JDK1.8.

Существует два класса классов - Duration и Period. Продолжительность - основанная на времени (nanos), а Period - дата (год/месяц/день).

Количество времени между двумя временными объектами одного и того же типа может быть легко рассчитано одним из двух способов (я предпочитаю первый):

long days = ChronoUnit.DAYS.between(start, end);
long days = start.until(end, ChronoUnit.DAYS);

Duration между двумя временными объектами того же типа можно рассчитать следующим образом:

Duration d = Duration.between(start, end);

Period между двумя объектами LocalDate можно рассчитать следующим образом:

Period p = Period.between(start, end);