Класс Java Period

PeriodКласс является частью API даты и времени, появившегося в Java 8, и находится вjava.timeпакете.

Класс Period в основном используется для представления временного интервала между двумя датами в единицах измерения: годы, месяцы и дни. В отличие отDurationкласса (который представляет интервалы времени, такие как часы, минуты и секунды),Periodон сосредоточен на различиях на уровне даты.


Основные возможности

1. Неизменяемость

PeriodКласс является неизменяемым, что означает, что как толькоPeriodобъект создан, его значение нельзя изменить. ЛюбаяPeriodоперация (например, сложение или вычитание) вернёт новыйPeriodэкземпляр.

2. Вычисления на основе дат

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

3. Интеграция с LocalDate

PeriodОбычно он используется сLocalDateКласс для вычисления разницы между двумя датами или для добавления/вычитания периода времени к дате/из даты.


Общие методы

Создание объектов Period

1. Использованиеof()method

Пример

Period period = Period.of(1, 2, 3); // 1 год 2 месяца 3 дня

2. Использованиеbetween()метод для вычисления интервала между двумя датами

Пример

LocalDate startDate = LocalDate.of(2020, 1, 1);
LocalDate endDate = LocalDate.of(2021, 3, 4);
Period period = Period.between(startDate, endDate);

3. Использованиеparse()метод для создания из строки

Пример

Period period = Period.parse("P1Y2M3D"); // формат ISO-8601

Получение компонентов Period

Пример

int years = period.getYears();  // Получить количество лет
int months = period.getMonths(); // Получить количество месяцев
int days = period.getDays();    // Получить количество дней

Операции

1. Операции сложения и вычитания

Пример

Период добавлен = period.plusYears(1).plusMonths(2);
Период вычтен = period.minusDays(5);

2. Определить, является ли он отрицательным

Пример

boolean isNegative = period.isNegative();

3. Нормализовать период

Пример

Период нормализован = period.normalized(); // Преобразовать месяцы, превышающие 12, в годы

Примеры практического применения

Вычисление интервала между двумя датами

Пример

LocalDate birthDate = LocalDate.of(1990, 5, 15);
LocalDate currentDate = LocalDate.now();
Period age = Period.between(birthDate, currentDate);
System.out.printf("Возраст: %d лет %d месяцев %d дней",
    age.getYears(), age.getMonths(), age.getDays());

Добавление Period к дате

Пример

LocalDate today = LocalDate.now();
Period twoMonths = Period.ofMonths(2);
LocalDate futureDate = today.plus(twoMonths);

Проверка, равен ли период нулю

Пример

Period zeroPeriod = Period.of(0, 0, 0);
if (zeroPeriod.isZero()) {
    System.out.println("Это нулевой период");
}

Комплексный пример

Пример

import java.time.Period;
import java.time.LocalDate;

public class PeriodDemo {
    public static void main(String[] args) {
        // Несколько способов создания объектов Period
       
        // 1. Использование метода of()
        Period period1 = Period.of(1, 2, 15); // 1 год 2 месяца 15 дней
        System.out.println("Период 1: " + period1);
       
        // 2. Использование метода between() для вычисления периода между двумя датами
        LocalDate startDate = LocalDate.of(2020, 1, 1);
        LocalDate endDate = LocalDate.of(2023, 5, 15);
        Period period2 = Period.between(startDate, endDate);
        System.out.println("Период между датами: " + period2);
       
        // 3. Использование метода parse() для создания из строки
        Period period3 = Period.parse("P1Y2M15D"); // Формат ISO-8601
        System.out.println("Разобранный период: " + period3);
    }
}

Вывод:

Period 1: P1Y2M15D
Period between dates: P3Y4M14D
Parsed Period: P1Y2M15D

Примечания

  1. Проблемы точности:PeriodОн вычисляет различия только в годах, месяцах и днях, игнорируя различия во времени (часах, минутах и т. д.).
  2. Обработка отрицательных значений: Если конечная дата раньше начальной,Period.between()будет возвращено отрицательное значение.
  3. Различия в количестве дней по месяцам:PeriodРасчёт учитывает разное количество дней в разных месяцах (например, в феврале 28 или 29 дней).
  4. Формат ISO-8601: При использованииparse()метода, строка должна соответствоватьPnYnMnDформату (например, "P1Y2M3D").

Итог

PeriodКласс — мощный инструмент для работы с интервалами на основе дат в Java date-time API. С его помощью разработчики могут удобно выполнять вычисления дат на уровне года, месяца и дня; он особенно подходит для бизнес-сценариев, требующих точности на уровне даты. ОсвоениеPeriodиспользования этого класса может сделать ваш код обработки дат более кратким и читаемым.

Другие расширения