Научитесь создавать и использовать класс Period, который был представлен как часть нового API даты и времени в Java 8. Класс Period представляет период времени в значениях на основе даты, таких как дни, месяцы, годы, недели или годы в календарной системе ISO-8601, например «1 год и 2 месяца».
Поддерживаемые единицы периода — ГОДЫ, МЕСЯЦЫ и ДНИ. Все три поля всегда присутствуют, но могут быть установлены на ноль или даже отрицательное значение.
Например, мы можем использовать экземпляр Period для представления общего времени, потраченного студентом на получение университетской степени.
1. Расчет периода
Класс Period используется для представления количества времени с использованием значений на основе даты в форматах периодов ISO-8601 PnYnMnD и PnW.
Например, строка P20Y2M25D представляет 20 лет, 2 месяца и 25 дней.
Период времени можно получить следующими способами.
1.1 Период между двумя датами
В основном Period используется для представления периода времени между двумя датами(например, между двумя экземплярами LocalDate ).
LocalDate startLocalDate = LocalDate.of(2020, 3, 12);LocalDate endLocalDate = LocalDate.of(2020, 7, 20);Period periodBetween = Period.between(startLocalDate, endLocalDate);System.out.println(periodBetween); // P4M8D - 4 months and 8 daysSystem.out.println(periodBetween.getDays()); //8System.out.println(periodBetween.getMonths()); //4System.out.println(periodBetween.getYears()); //0System.out.println(periodBetween.get(ChronoUnit.DAYS)); //8
1.2 Создание периода со значениями
Класс Period использует следующие методы для представления периода времени в различных единицах:
- ofDays(int days) – период, представляющий количество дней.
- ofMonths(int months) – период, представляющий количество месяцев.
- ofWeeks(int weeks) – период, представляющий количество недель.
- ofYears(int years) – период, представляющий количество лет.
//20 years, 3 months and 20 daysPeriod periodFromUnits = Period.of(20, 3, 20);Period fromDays = Period.ofDays(150); // 150 daysPeriod fromMonths = Period.ofMonths(4); // 4 monthsPeriod fromYears = Period.ofYears(10); // 10 yearsPeriod fromWeeks = Period.ofWeeks(15); // 15 weeks
1.3. Разбор строки по точкам
Период можно получить из содержащихся в нем форматов периодов ISO-8601.
//20 years, 3 months and 20 daysPeriod periodFromString1 = Period.parse("P20Y3M20D");//365 DaysPeriod periodFromString2 = Period.parse("P365D");//52 WeeksPeriod periodFromString3 = Period.parse("P52W");
2. Извлечение значений из периода
Значения периода можно получить с помощью методов-геттеров:
- Period.getDays() – Получает количество дней этого периода.
- Period.getMonths() – Получает количество месяцев этого периода.
- Period.getYears() – Получает количество лет данного периода.
- Period.get(TemporalUnit unit) – Получает значение запрошенной единицы. Обратите внимание, что поддерживаемые единицы — ГОДЫ, МЕСЯЦЫ и ДНИ. Все остальные единицы выдают исключение UnsupportedTemporalTypeException.
LocalDate startLocalDate = LocalDate.of(2020, 3, 12);LocalDate endLocalDate = LocalDate.of(2020, 7, 20);Period periodBetween = Period.between(startLocalDate, endLocalDate);periodBetween.getDays(); //8periodBetween.getMonths(); //4periodBetween.getYears(); //0periodBetween.get(ChronoUnit.DAYS); //8//Throws UnsupportedTemporalTypeExceptionperiodBetween.get(ChronoUnit.WEEKS);
3. Изменение периода
Мы можем добавлять или вычитать время или другой период из заданного экземпляра Period.
Обратите внимание, что Period — неизменяемый класс, поэтому каждый метод, перечисленный ниже, вернет новый экземпляр Period с измененным значением.
- plus(period) – возвращает копию указанного периода с добавленным указанным периодом.
- plusYears() – возвращает копию указанного периода с добавленными указанными годами.
- plusMonths() – возвращает копию указанного периода с добавленными указанными месяцами.
- plusDays() – возвращает копию указанного периода с добавленными указанными днями.
- minus(период) – возвращает копию указанного периода, из которого вычтен указанный период.
- minusYears() – возвращает копию указанного периода за вычетом указанного количества лет.
- minusMonths() – возвращает копию указанного периода за вычетом указанных месяцев.
- minusDays() – возвращает копию указанного периода за вычетом указанных дней.
- multipliedBy(scalar) – возвращает новый экземпляр, в котором каждый элемент в этом периоде умножен на указанный скаляр.
Period period = Period.ofDays(5);Period periodDaysAdded = period.plus(5);Period periodPlus1Year = period.plusYears(1L);