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 .