1. Обзор
В этом кратком руководстве мы рассмотрим два новых класса для работы с датами, появившихся в Java 8: Period
и Duration
.
Оба класса можно использовать для представления количества времени или определения разницы между двумя датами. Основное различие между этими двумя классами заключается в том, что Period
использует значения на основе даты, а Duration
использует значения на основе времени.
2. Класс периода
Класс Period
использует единицы год, месяц и день для представления периода времени.
Мы можем получить объект Period
как разницу между двумя датами, используя метод between()
:
LocalDate startDate = LocalDate.of(2015, 2, 20);
LocalDate endDate = LocalDate.of(2017, 1, 15);
Period period = Period.between(startDate, endDate);
Затем мы можем определить единицы даты периода, используя методы getYears(), getMonths(), getDays()
:
LOG.info("Years:" + period.getYears() +
" months:" + period.getMonths() +
" days:"+period.getDays());
В этом случае метод isNegative()
, который возвращает true
, если какая-либо из единиц отрицательна, может использоваться для определения того, выше ли endDate
, чем startDate
:
assertFalse(period.isNegative());
Если isNegative()
возвращает false, то значение startDate
предшествует значению endDate
.
Другой способ создания объекта Period
основан на количестве дней, месяцев, недель или лет с использованием специальных методов:
Period fromUnits = Period.of(3, 10, 10);
Period fromDays = Period.ofDays(50);
Period fromMonths = Period.ofMonths(5);
Period fromYears = Period.ofYears(10);
Period fromWeeks = Period.ofWeeks(40);
assertEquals(280, fromWeeks.getDays());
Если присутствует только одно из значений, например, с помощью метода ofDays()
, тогда значение других единиц равно 0.
В случае метода ofWeeks()
значение параметра используется для установки количества дней путем умножения его на 7.
Мы также можем создать объект Period
, проанализировав текстовую последовательность , которая должна иметь формат «PnYnMnD»:
Period fromCharYears = Period.parse("P2Y");
assertEquals(2, fromCharYears.getYears());
Period fromCharUnits = Period.parse("P2Y3M5D");
assertEquals(5, fromCharUnits.getDays());
Значение периода может быть увеличено или уменьшено с помощью методов формы plusX()
и minusX()
, где X представляет единицу измерения даты:
assertEquals(56, period.plusDays(50).getDays());
assertEquals(9, period.minusMonths(2).getMonths());
3. Класс продолжительности
Класс Duration
представляет интервал времени в секундах или наносекундах и лучше всего подходит для обработки более коротких промежутков времени в случаях, требующих большей точности.
Мы можем определить разницу между двумя моментами времени как объект Duration
, используя метод between()
:
Instant start = Instant.parse("2017-10-03T10:15:30.00Z");
Instant end = Instant.parse("2017-10-03T10:16:30.00Z");
Duration duration = Duration.between(start, end);
Затем мы можем использовать методы getSeconds()
или getNanoseconds()
для определения значения единиц времени:
assertEquals(60, duration.getSeconds());
В качестве альтернативы мы можем получить экземпляр Duration из двух экземпляров LocalDateTime:
LocalTime start = LocalTime.of(1, 20, 25, 1024);
LocalTime end = LocalTime.of(3, 22, 27, 1544);
Duration.between(start, end).getSeconds();
Метод isNegative()
можно использовать для проверки того, выше ли конечный момент, чем начальный момент:
assertFalse(duration.isNegative());
Мы также можем получить объект Duration
на основе нескольких единиц времени , используя методы ofDays(), ofHours(), ofMillis(), ofMinutes(), ofNanos(), ofSeconds()
:
Duration fromDays = Duration.ofDays(1);
assertEquals(86400, fromDays.getSeconds());
Duration fromMinutes = Duration.ofMinutes(60);
Чтобы создать объект Duration
на основе текстовой последовательности, она должна иметь вид «PnDTnHnMn.nS»:
Duration fromChar1 = Duration.parse("P1DT1H10M10.5S");
Duration fromChar2 = Duration.parse("PT10M");
Продолжительность может быть преобразована в другие единицы времени с помощью toDays(), toHours(), toMillis(), toMinutes()
:
assertEquals(1, fromMinutes.toHours());
Значение продолжительности может быть увеличено или уменьшено с помощью методов формы plusX()
или minusX()
, где X может обозначать дни, часы, миллисекунды, минуты, нано или секунды:
assertEquals(120, duration.plusSeconds(60).getSeconds());
assertEquals(30, duration.minusSeconds(30).getSeconds());
Мы также можем использовать методы plus()
и minus()
с параметром, который указывает TemporalUnit
для добавления или вычитания:
assertEquals(120, duration.plus(60, ChronoUnit.SECONDS).getSeconds());
assertEquals(30, duration.minus(30, ChronoUnit.SECONDS).getSeconds());
4. Вывод
В этом уроке мы показали, как мы можем использовать классы Period
и Duration .
Как всегда, полный исходный код примеров можно найти на GitHub .