Период и продолжительность в Java

Период и продолжительность в Java

1. обзор

В этом кратком руководстве мы рассмотрим два новых класса для работы с датами, представленные в Java 8:Period иDuration.

Оба класса могут использоваться для представления количества времени или определения разницы между двумя датами. Основное различие между этими двумя классами заключается в том, чтоPeriod использует значения на основе даты, аDuration использует значения на основе времени.

2. Period Класс

Класс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, если какая-либо из единиц является отрицательной, может использоваться для определения того, превышает лиendDatestartDate:

assertFalse(period.isNegative());

ЕслиisNegative() возвращает false, тоstartDate раньше, чем значениеendDate.

Другой способcreate a Period object is based on the number of days, months, weeks or years с использованием специальных методов:

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.

Мы также можемcreate a Period object by parsing a text sequence, который должен иметь формат «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 представляет интервал времени в секундах или наносекундах и больше всего подходит для обработки более коротких промежутков времени в случаях, когда требуется большая точность.

Мы можем определить разницу между двумя моментами как объект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());

Мы также можемobtain a Duration object based on several time units, используя методы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");

A duration can be converted to other time units с использованием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.

Как всегда, полный исходный код примеров можно найтиover on GitHub.