Рубрики
Без рубрики

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

Узнайте, в чем разница между классами Duration и Period в Java.

Автор оригинала: baeldung.

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);

Затем мы можем определить единицы измерения даты периода с помощью методов getyear(), getmonth(), getday() :

LOG.info("Years:" + period.getYears() + 
  " months:" + period.getMonths() + 
  " days:"+period.getDays());

В этом случае метод isNegative () , который возвращает true , если какая-либо из единиц отрицательна, может быть использован для определения того, является ли EndDate выше, чем StartDate :

assertFalse(period.isNegative());

Если отрицательно() возвращает false, то дата начала является более ранней, чем значение EndDate .

Другой способ создать Период объект основан на количестве дней, месяцев, недель или лет с использованием специальных методов:

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());

Если присутствует только одно из значений, например, с помощью метода of Days () , то значение остальных единиц равно 0.

В случае метода of Weeks() значение параметра используется для установки количества дней путем умножения его на 7.

Мы также можем создать объект Period , проанализировав текстовую последовательность , которая должна иметь формат “PnYnMnD”:

Period fromCharYears = Period.parse("P2Y");
assertEquals(2, fromCharYears.getYears());

Period fromCharUnits = Period.parse("P2Y3M5D");
assertEquals(5, fromCharUnits.getDays());

Значение периода может быть увеличено или уменьшено с помощью методов вида плюс() и минус X() , где 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);

Затем мы можем использовать методы get Seconds() или 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();

Метод is Negative() можно использовать для проверки того, что конечный момент выше начального:

assertFalse(duration.isNegative());

Мы также можем получить Длительность объекта на основе нескольких единиц времени , используя методы Дней(), Часов(), Миллионов(), Минут(), NANOS(), ofSeconds() :

Duration fromDays = Duration.ofDays(1);
assertEquals(86400, fromDays.getSeconds());
       
Duration fromMinutes = Duration.ofMinutes(60);

Чтобы создать объект Duration на основе текстовой последовательности, он должен иметь вид “Pndtnhnmns.nS”:

Duration fromChar1 = Duration.parse("P1DT1H10M10.5S");
Duration fromChar2 = Duration.parse("PT10M");

Продолжительность может быть преобразована в другие единицы времени с помощью toDays(), в Часы(), toMillis(), в Минуты() :

assertEquals(1, fromMinutes.toHours());

Значение длительности может быть увеличено или уменьшено с помощью методов вида плюс() или минус X() , где X может стоять в течение дней, часов, миллисекунд, минут, нанометров или секунд:

assertEquals(120, duration.plusSeconds(60).getSeconds());     
assertEquals(30, duration.minusSeconds(30).getSeconds());

Мы также можем использовать методы plus() и minus() с параметром, указывающим Временную единицу для сложения или вычитания:

assertEquals(120, duration.plus(60, ChronoUnit.SECONDS).getSeconds());     
assertEquals(30, duration.minus(30, ChronoUnit.SECONDS).getSeconds());

4. Заключение

В этом уроке мы показали, как мы можем использовать классы Period и Duration .

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