Period
– календарный период. Количество дней, месяцев и лет. Одним днем здесь считается день в терминах ZonedDateTime
.Duration
– длительность времени. Количество наносекунд, секунд, минут, часов, и тоже дней. Здесь один день – ровно 24 часа.Оба класса реализуют общий интерфейс
TemporalAmount
– период времени вообще. Оба иммутабельны, и как следствие, потокобезопасны. Любая модифицирующая операция вроде plusX()
возвращает новый экземпляр с измененным значением.Экземпляры обоих классов могут быть созданы из значений отдельных компонентов, из двух моментов времени методом between, или из строки. Строковое представление Duration:
"P2DT3H4M"
, Period: "P1Y2M3D"
.До Java 8 основным способом хранения периода были числовые примитивы. В этом подходе есть много недостатков, среди которых в первую очередь неограниченность значений и ненаглядность. Чтобы в Java 8+ получить период числом, используется метод
between()
нужного элемента енама ChronoUnit
.