Классы Duration и Period в Java
Duration — это класс java.time.Duration, который хранит точный промежуток времени в секундах и наносекундах, например PT1H30M (1 час 30 минут) или PT12.87656S. Его пара — Period (java.time.Period): промежуток в календарных годах, месяцах и днях, например P5Y2M9D. Оба класса появились в Java 8, неизменяемы и потокобезопасны.
Прибавьте к полудню субботы 30 марта 2024 года в Берлине Period.ofDays(1) и Duration.ofDays(1): первый вариант даст воскресенье 12:00, второй — 13:00. В ночь на 31 марта часы перевели вперёд, в календарных сутках оказалось 23 часа, и только Period это учёл. Поэтому выбор между классами — не вопрос вкуса.
Duration и Period: в чём разница
Duration измеряет физическое время: сутки в нём — ровно 86 400 секунд. Period измеряет календарное время: месяц может длиться 28–31 день, а день — 23 или 25 часов при переводе часов. Используйте Duration для тайм-аутов и длительности операций, Period — для возраста, сроков договора и «через 2 месяца».
| Признак | Duration | Period |
|---|---|---|
| Что хранит | Секунды (long) и наносекунды (int) | Годы, месяцы, дни (три int) |
Пример toString() | PT1H30M, PT48H (дни не выводятся) | P1Y2M3D, P14D |
| Разница между значениями | Duration.between() — LocalTime, LocalDateTime, Instant | Period.between() — только LocalDate |
| Можно прибавить к | LocalTime, LocalDateTime, ZonedDateTime, Instant | LocalDate, LocalDateTime, ZonedDateTime |
| Перевод часов | Не учитывает: прибавляет ровно 24 часа на день | Учитывает: сохраняет время «на часах» |
equals() | ofHours(1).equals(ofMinutes(60)) — true | ofMonths(12).equals(ofYears(1)) — false |
| Когда использовать | Тайм-ауты, время выполнения, длительность звонка | Возраст, срок подписки, гарантийный срок |
Пример из начала урока целиком — 31 марта 2024 года в Германии часы перевели с 02:00 на 03:00:
import java.time.Duration;
import java.time.Period;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class DurationVsPeriodExample {
public static void main(String[] args) {
ZonedDateTime base = ZonedDateTime.of(2024, 3, 30, 12, 0, 0, 0, ZoneId.of("Europe/Berlin"));
System.out.println(base);
System.out.println(base.plus(Period.ofDays(1)));
System.out.println(base.plus(Duration.ofDays(1)));
}
} 2024-03-30T12:00+01:00[Europe/Berlin]
2024-03-31T12:00+02:00[Europe/Berlin]
2024-03-31T13:00+02:00[Europe/Berlin] Period.ofDays(1) сдвинул календарную дату и оставил 12:00, а Duration.ofDays(1) прибавил 24 реальных часа, которые из-за пропущенного часа закончились в 13:00. Оба класса реализуют интерфейс TemporalAmount, поэтому передаются в один и тот же метод plus(). Обзор всех классов пакета — в уроке Дата и время в Java.
Класс Duration: создание через of*()
Объект Duration создают статическими методами: ofDays(), ofHours(), ofMinutes(), ofSeconds(), ofMillis(), ofNanos() и универсальным of(количество, ChronoUnit). Конструктора у класса нет. Значение может быть отрицательным, а нулевая длительность доступна как константа Duration.ZERO.
Пример создания объектов класса java.time.Duration:
import java.time.Duration;
import java.time.temporal.ChronoUnit;
public class DurationExample1 {
public static void main(String[] args) {
Duration oneDay = Duration.ofDays(1);
Duration oneHour = Duration.ofHours(1);
Duration oneMin = Duration.ofMinutes(1);
Duration tenSeconds = Duration.ofSeconds(10);
Duration twoSeconds = Duration.ofSeconds(1, 1_000_000_000);
Duration oneSecondFromMillis = Duration.ofMillis(1000);
Duration oneSecondFromNanos = Duration.ofNanos(1_000_000_000);
Duration oneSecond = Duration.of(1, ChronoUnit.SECONDS);
Duration ninetySeconds = Duration.ofSeconds(90);
Duration oneAndHalfSeconds = Duration.ofMillis(1500);
Duration minusNinety = Duration.ofSeconds(-90);
System.out.println("oneDay: " + oneDay);
System.out.println("oneHour: " + oneHour);
System.out.println("oneMin: " + oneMin);
System.out.println("tenSeconds: " + tenSeconds);
System.out.println("twoSeconds: " + twoSeconds);
System.out.println("oneSecondFromMillis: " + oneSecondFromMillis);
System.out.println("oneSecondFromNanos: " + oneSecondFromNanos);
System.out.println("oneSecond: " + oneSecond);
System.out.println("ninetySeconds: " + ninetySeconds);
System.out.println("oneAndHalfSeconds: " + oneAndHalfSeconds);
System.out.println("minusNinety: " + minusNinety);
}
} oneDay: PT24H
oneHour: PT1H
oneMin: PT1M
tenSeconds: PT10S
twoSeconds: PT2S
oneSecondFromMillis: PT1S
oneSecondFromNanos: PT1S
oneSecond: PT1S
ninetySeconds: PT1M30S
oneAndHalfSeconds: PT1.5S
minusNinety: PT-1M-30S Обратите внимание на первую строку: Duration.ofDays(1) выводится как PT24H. Внутри хранятся только секунды, и toString() никогда не показывает дни. Во второй форме ofSeconds(1, 1_000_000_000) лишний миллиард наносекунд превращается в целую секунду — получается PT2S.
Метод of() принимает только единицы с точной длиной — от NANOS до DAYS. Месяц или год разной длины в Duration не помещается:
Duration.of(1, ChronoUnit.DAYS); // PT24H
Duration.of(1, ChronoUnit.MONTHS); // UnsupportedTemporalTypeException: Unit must not have an estimated duration Duration.between: длительность между двумя моментами
Duration.between(start, end) возвращает точное время между двумя значениями, у которых есть время суток: LocalTime, LocalDateTime, ZonedDateTime или Instant. Если end раньше start, длительность будет отрицательной. Для LocalDate метод не работает — у даты нет секунд.
Пример расчёта длительности рабочего дня:
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalTime;
public class DurationBetweenExample {
public static void main(String[] args) {
LocalTime start = LocalTime.of(9, 15);
LocalTime end = LocalTime.of(17, 45, 30);
Duration work = Duration.between(start, end);
System.out.println(work); // PT8H30M30S
System.out.println(work.toMinutes()); // 510
System.out.println(Duration.between(end, start)); // PT-8H-30M-30S
LocalDate d1 = LocalDate.of(2024, 1, 1);
LocalDate d2 = LocalDate.of(2024, 1, 2);
System.out.println(Duration.between(d1.atStartOfDay(), d2.atStartOfDay())); // PT24H
Duration.between(d1, d2); // UnsupportedTemporalTypeException: Unsupported unit: Seconds
}
} Если нужно одно число в конкретных единицах, а не объект, подойдёт ChronoUnit.MINUTES.between(start, end) — он тоже вернёт 510. Разница между двумя Instant разобрана в уроке Класс Instant, между LocalDateTime — в уроке LocalDateTime. Для замера времени выполнения кода берут System.nanoTime() — см. LocalTime.now() и System.nanoTime().
Получение секунд и минут, формат «чч:мм:сс»
Методы to*() переводят всю длительность в одну единицу: toHours(), toMinutes(), toMillis(), toNanos(), а также getSeconds(). Методы to*Part() (Java 9+) возвращают отдельную часть: toHoursPart(), toMinutesPart(), toSecondsPart(). Дробная часть при переводе отбрасывается.
Пример для длительности 2 часа 30 минут 30,5 секунды:
import java.time.Duration;
import java.time.temporal.ChronoUnit;
public class DurationGetExample {
public static void main(String[] args) {
Duration d = Duration.ofSeconds(9030, 500_000_000);
System.out.println(d); // PT2H30M30.5S
System.out.println(d.getSeconds()); // 9030
System.out.println(d.getNano()); // 500000000
System.out.println(d.toDays()); // 0
System.out.println(d.toHours()); // 2
System.out.println(d.toMinutes()); // 150
System.out.println(d.toMillis()); // 9030500
System.out.println(d.get(ChronoUnit.SECONDS)); // 9030
// Java 9+
System.out.println(d.toSeconds()); // 9030
System.out.println(d.toHoursPart()); // 2
System.out.println(d.toMinutesPart()); // 30
System.out.println(d.toSecondsPart()); // 30
System.out.println(d.toMillisPart()); // 500
}
} getSeconds() — это все 9030 секунд, а не «секунды на циферблате». Универсальный get() поддерживает только ChronoUnit.SECONDS и ChronoUnit.NANOS: d.get(ChronoUnit.MINUTES) выбросит UnsupportedTemporalTypeException: Unsupported unit: Minutes.
Готового форматтера для Duration нет: DateTimeFormatter работает с датами и временем суток, а не с промежутками. Строку вида «02:30:30» собирают из частей:
Duration d = Duration.ofSeconds(9030);
Duration big = Duration.ofSeconds(100_000);
// Java 9+
String hms = String.format("%02d:%02d:%02d", d.toHours(), d.toMinutesPart(), d.toSecondsPart());
// Java 8
String hms8 = String.format("%02d:%02d:%02d", d.toHours(), d.toMinutes() % 60, d.getSeconds() % 60);
String bigHms = String.format("%02d:%02d:%02d", big.toHours(), big.toMinutesPart(), big.toSecondsPart());
System.out.println(hms); // 02:30:30
System.out.println(hms8); // 02:30:30
System.out.println(big); // PT27H46M40S
System.out.println(bigHms); // 27:46:40 Иногда советуют трюк LocalTime.MIDNIGHT.plus(d).format(...). Он работает только для длительностей меньше суток: для big время «перевалит» через полночь и покажет 03:46:40. Шаблоны дат и времени разобраны в уроке Класс DateTimeFormatter.
Изменение и сравнение Duration
Длительность изменяют методами plus*() и minus*() (дни, часы, минуты, секунды, миллисекунды, наносекунды или другой Duration), а также multipliedBy(), dividedBy(), negated() и abs(). Методы withSeconds() и withNanos() заменяют значение целиком. Каждый вызов возвращает новый объект — результат нужно присвоить.
Пример арифметики с длительностью в 1 час:
import java.time.Duration;
public class DurationPlusExample {
public static void main(String[] args) {
Duration base = Duration.ofHours(1);
System.out.println(base.plusMinutes(30)); // PT1H30M
System.out.println(base.plusSeconds(15)); // PT1H15S
System.out.println(base.plusMillis(500)); // PT1H0.5S
System.out.println(base.plusDays(1)); // PT25H
System.out.println(base.plus(Duration.ofMinutes(45))); // PT1H45M
System.out.println(base.minusMinutes(90)); // PT-30M
System.out.println(base.multipliedBy(3)); // PT3H
System.out.println(base.dividedBy(4)); // PT15M
System.out.println(base.negated()); // PT-1H
System.out.println(base.minusMinutes(90).abs()); // PT30M
// Сколько 15-минутных слотов в 2 часах (Java 9+)
System.out.println(Duration.ofHours(2).dividedBy(Duration.ofMinutes(15))); // 8
System.out.println(Duration.ofMinutes(5).withSeconds(10)); // PT10S
System.out.println(Duration.ofMinutes(5).withNanos(500_000_000)); // PT5M0.5S
}
} Неочевидный момент — withSeconds(10): он не меняет «секунды» внутри 5 минут, а заменяет всю длительность на 10 секунд. Нулевые минуты toString() пропускает, поэтому 1 час 15 секунд выводится как PT1H15S.
Для сравнения длительностей служат equals(), compareTo() (класс реализует Comparable<Duration>), isZero(), isNegative() и с Java 18 — isPositive():
import java.time.Duration;
public class DurationCompareExample {
public static void main(String[] args) {
Duration a = Duration.ofMinutes(90);
Duration b = Duration.ofHours(1).plusMinutes(30);
Duration c = Duration.ofHours(2);
System.out.println(a.equals(b)); // true
System.out.println(a.compareTo(c) < 0); // true
System.out.println(a.minus(c).isNegative()); // true
System.out.println(a.minus(b).isZero()); // true
System.out.println(Duration.ofHours(1).equals(Duration.ofMinutes(60))); // true
}
} Две длительности равны, если равно общее количество секунд и наносекунд, — неважно, каким методом их создали. Результат compareTo() сравнивайте с нулём, а не с -1.
Класс Period: создание через of*()
java.time.Period хранит промежуток в годах, месяцах и днях, например 5 лет, 2 месяца и 9 дней (P5Y2M9D). Создают его методами of(годы, месяцы, дни), ofYears(), ofMonths(), ofWeeks(), ofDays(); нулевой период — Period.ZERO. Значения не нормализуются: 14 месяцев так и останутся 14 месяцами.
Пример создания объектов класса Period:
import java.time.Period;
public class PeriodExample1 {
public static void main(String[] args) {
Period period5y4m3d = Period.of(5, 4, 3);
Period period2d = Period.ofDays(2);
Period period2m = Period.ofMonths(2);
Period period14d = Period.ofWeeks(2);
Period period2y = Period.ofYears(2);
Period period14m40d = Period.of(0, 14, 40);
System.out.println(period5y4m3d); // P5Y4M3D
System.out.println(period2d); // P2D
System.out.println(period2m); // P2M
System.out.println(period14d); // P14D
System.out.println(period2y); // P2Y
System.out.println(period14m40d); // P14M40D
System.out.println(Period.ZERO); // P0D
}
} Недель внутри Period нет: ofWeeks(2) сразу превращается в 14 дней. Дни, в свою очередь, никогда не пересчитываются в месяцы, потому что длина месяца заранее неизвестна.
Period.between и ChronoUnit.between
Period.between(начало, конец) возвращает разницу между двумя LocalDate в виде «N лет, M месяцев, K дней»: сначала считаются полные месяцы, затем оставшиеся дни. Конечная дата в подсчёт не входит. Если нужно одно число — всего дней или месяцев, — используйте ChronoUnit.DAYS.between() или ChronoUnit.MONTHS.between().
Пример: разница между датами и расчёт возраста:
import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.ChronoUnit;
public class PeriodExample2 {
public static void main(String[] args) {
LocalDate march2003 = LocalDate.of(2003, 3, 1);
LocalDate may2003 = LocalDate.of(2003, 5, 1);
System.out.println(Period.between(march2003, may2003)); // P2M
System.out.println(Period.between(may2003, march2003)); // P-2M
LocalDate birthday = LocalDate.of(1990, 8, 25);
LocalDate today = LocalDate.of(2024, 3, 15);
Period age = Period.between(birthday, today);
System.out.println(age); // P33Y6M19D
System.out.println("Полных лет: " + age.getYears()); // Полных лет: 33
System.out.println(ChronoUnit.YEARS.between(birthday, today)); // 33
}
} Что выведет этот код? С 31 января до 1 марта 2024 года прошло 30 дней, но Period видит это иначе:
LocalDate start = LocalDate.of(2024, 1, 31);
LocalDate end = LocalDate.of(2024, 3, 1);
Period p = Period.between(start, end);
System.out.println(p); // P1M1D
System.out.println(p.getDays()); // 1
System.out.println(ChronoUnit.DAYS.between(start, end)); // 30
System.out.println(ChronoUnit.MONTHS.between(start, end)); // 1
System.out.println(start.until(end)); // P1M1D От 31 января один месяц — это 29 февраля (последний день короткого месяца), и до 1 марта остаётся 1 день. Поэтому getDays() возвращает только «хвост» дней, а не общее количество. Для «сколько дней между датами» нужен ChronoUnit.DAYS.between() — подробнее в уроке LocalDate: сколько дней между двумя датами. Метод Period.between() принимает только LocalDate; для LocalDateTime сначала вызовите toLocalDate().
Методы Period: get, with, plus, minus, normalized
Части периода читают методами getYears(), getMonths(), getDays() и get(ChronoUnit), заменяют — withYears(), withMonths(), withDays(), сдвигают — plus*() и minus*(). Метод normalized() переводит лишние месяцы в годы, а toTotalMonths() возвращает общее число месяцев.
Пример использования методов get класса Period:
import java.time.Period;
import java.time.temporal.ChronoUnit;
public class PeriodExample3 {
public static void main(String[] args) {
Period period5y4m3d = Period.of(5, 4, 3);
int days = period5y4m3d.getDays();
int months = period5y4m3d.getMonths();
int years = period5y4m3d.getYears();
long days2 = period5y4m3d.get(ChronoUnit.DAYS);
System.out.println("Дни: " + days);
System.out.println("Месяцы: " + months);
System.out.println("Годы: " + years);
System.out.println("Дни: " + days2);
System.out.println("Всего месяцев: " + period5y4m3d.toTotalMonths());
System.out.println("Единицы: " + period5y4m3d.getUnits());
}
} Дни: 3
Месяцы: 4
Годы: 5
Дни: 3
Всего месяцев: 64
Единицы: [Years, Months, Days] get() понимает только YEARS, MONTHS и DAYS: period.get(ChronoUnit.WEEKS) выбросит UnsupportedTemporalTypeException: Unsupported unit: Weeks.
Для изменения года, месяца или дня используются методы with класса Period:
import java.time.Period;
public class PeriodExample4 {
public static void main(String[] args) {
Period period2d = Period.ofDays(2);
Period period8d = period2d.withDays(8);
Period period2y1m2d = period2d.withYears(2).withMonths(1);
System.out.println(period2d); // P2D
System.out.println(period8d); // P8D
System.out.println(period2y1m2d); // P2Y1M2D
}
} Для добавления или вычитания лет, месяцев или дней используются методы plus и minus класса Period:
import java.time.Period;
public class PeriodExample5 {
public static void main(String[] args) {
Period period5y4m3d = Period.of(5, 4, 3);
Period period2y = Period.ofYears(2);
// Добавление
System.out.println(period5y4m3d.plusYears(4)); // P9Y4M3D
System.out.println(period5y4m3d.plusMonths(3)); // P5Y7M3D
System.out.println(period5y4m3d.plusDays(3)); // P5Y4M6D
System.out.println(period5y4m3d.plus(period2y)); // P7Y4M3D
// Вычитание
System.out.println(period5y4m3d.minusYears(2)); // P3Y4M3D
System.out.println(period5y4m3d.minusMonths(1)); // P5Y3M3D
System.out.println(period5y4m3d.minusDays(1)); // P5Y4M2D
System.out.println(period5y4m3d.minus(period2y)); // P3Y4M3D
// Умножение и смена знака
System.out.println(period5y4m3d.multipliedBy(2)); // P10Y8M6D
System.out.println(period5y4m3d.negated()); // P-5Y-4M-3D
}
} В plus() можно передать только «календарную» величину: Period.ofDays(1).plus(Duration.ofHours(2)) выбросит DateTimeException: Unit must be Years, Months or Days, but was Seconds.
Метод normalized() пересчитывает месяцы сверх 12 в годы, но дни не трогает:
System.out.println(Period.of(1, 14, 40).normalized()); // P2Y2M40D
System.out.println(Period.of(1, -1, 0).normalized()); // P11M
System.out.println(Period.ofMonths(12).equals(Period.ofYears(1))); // false
System.out.println(Period.ofMonths(12).normalized().equals(Period.ofYears(1))); // true В отличие от Duration, equals() у Period сравнивает поля по отдельности: 12 месяцев и 1 год — разные периоды, пока не вызван normalized(). А compareTo() у Period нет совсем — без опорной даты нельзя сказать, что больше: 1 месяц или 30 дней.
parse() и toString(): формат ISO-8601 PT… и P…
Оба класса выводятся и разбираются в формате ISO-8601. Duration записывается как PT + часы H, минуты M, секунды S (например, PT1H30M), Period — как P + годы Y, месяцы M, недели W, дни D (например, P1Y2M3D). Буква T отделяет время от дат: P1M — месяц, PT1M — минута.
Пример разбора строк методами Duration.parse() и Period.parse():
import java.time.Duration;
import java.time.Period;
public class ParseExample {
public static void main(String[] args) {
System.out.println(Duration.parse("PT1H30M")); // PT1H30M
System.out.println(Duration.parse("PT90M")); // PT1H30M
System.out.println(Duration.parse("P2DT3H")); // PT51H
System.out.println(Duration.parse("PT-1.5S")); // PT-1.5S
System.out.println(Duration.parse("-PT6H3M")); // PT-6H-3M
System.out.println(Period.parse("P1Y2M3D")); // P1Y2M3D
System.out.println(Period.parse("P2W")); // P14D
System.out.println(Period.parse("P1Y2W3D")); // P1Y17D
System.out.println(Period.parse("-P1M")); // P-1M
}
} Duration.parse() принимает дни (P2DT3H), но сразу переводит их в часы по 24, поэтому toString() покажет PT51H. Годы и месяцы в Duration недопустимы, а время — в Period. Строки другого вида не разбираются:
Duration.parse("1:30"); // DateTimeParseException: Text cannot be parsed to a Duration
Duration.parse("P1M"); // DateTimeParseException: Text cannot be parsed to a Duration
Period.parse("PT1H"); // DateTimeParseException: Text cannot be parsed to a Period Строка вида «01:30» в Duration
Формат «часы:минуты» Duration.parse() не понимает. Если время пришло из формы или CSV, разберите его вручную: String[] p = "01:30".split(":"); Duration d = Duration.ofHours(Long.parseLong(p[0])).plusMinutes(Long.parseLong(p[1])); — получится PT1H30M. Обратно в «01:30» — через String.format(), как в разделе формат «чч:мм:сс».
Где чаще всего ошибаются
Большинство промахов с Duration и Period возникает, когда классы путают между собой или принимают «часть» значения за всё значение. Объекты неизменяемы, поэтому результат plus*() и with*() тоже нужно присваивать. Ниже — типичные случаи и исправления.
| Ошибка | Что происходит | Как правильно |
|---|---|---|
Period.between(a, b).getDays() как «всего дней» | Возвращает только остаток дней: для P1M1D — 1, а не 30 | ChronoUnit.DAYS.between(a, b) |
duration.getSeconds() как секунды для «чч:мм:сс» | Для PT2H30M30S вернёт 9030, а не 30 | toSecondsPart() (Java 9+) или getSeconds() % 60 |
Duration.between(localDate1, localDate2) | UnsupportedTemporalTypeException: Unsupported unit: Seconds | Period.between() или atStartOfDay() у обеих дат |
localDate.plus(Duration.ofDays(1)) | UnsupportedTemporalTypeException: Unsupported unit: Seconds | localDate.plus(Period.ofDays(1)) или plusDays(1) |
localTime.plus(Period.ofDays(1)) | UnsupportedTemporalTypeException: Unsupported unit: Days | Для времени суток — только Duration |
Duration.of(1, ChronoUnit.MONTHS) | UnsupportedTemporalTypeException: Unit must not have an estimated duration | Period.ofMonths(1) |
Duration.ofDays(1) для «завтра в то же время» в зоне с переводом часов | Раз в полгода результат сдвигается на час | zonedDateTime.plus(Period.ofDays(1)) |
Period.ofMonths(12).equals(Period.ofYears(1)) | false: поля сравниваются по отдельности | Сравнивать после normalized() или через toTotalMonths() |
Часто задаваемые вопросы
Как сохранить Duration в базе данных или в JSON?
Стандартного SQL-типа для Duration в JDBC нет, поэтому обычно хранят число (duration.toMillis() или getSeconds() в столбце BIGINT) или строку ISO-8601 из toString(), например PT1H30M, и восстанавливают через Duration.ofMillis() или Duration.parse(). Hibernate отображает поле Duration сам. Jackson с JavaTimeModule по умолчанию пишет Duration числом секунд, а при выключенном WRITE_DURATIONS_AS_TIMESTAMPS — строкой PT1H30M.
Где в стандартной библиотеке Java принимают Duration для тайм-аутов?
HttpClient.Builder.connectTimeout(Duration) и HttpRequest.Builder.timeout(Duration) — с Java 11, Thread.sleep(Duration) и Thread.join(Duration) — с Java 19. Если API ждёт пару long и TimeUnit, передайте duration.toMillis() и TimeUnit.MILLISECONDS. Обратно: Duration.of(n, timeUnit.toChronoUnit()) — метод toChronoUnit() есть с Java 9.
Есть ли в java.time класс интервала с началом и концом?
Нет. Duration и Period описывают только длину промежутка и не помнят, где он начался. Интервал хранят парой значений, например двумя Instant или двумя LocalDate, а длину получают через between(). Готовые классы Interval и LocalDateRange есть в библиотеке ThreeTen-Extra от автора java.time.
Как записать срок «1 день и 2 часа» одним значением?
В JDK нет класса, который хранит одновременно календарные дни и часы. Duration.ofDays(1).plusHours(2) даст PT26H — сутки будут считаться ровно 24 часами. Если важен календарный день, прибавляйте по очереди: dateTime.plus(Period.ofDays(1)).plus(Duration.ofHours(2)). Почему это не одно и то же — в разделе Duration и Period: в чём разница.
Practice
Reinforce this lesson with hands-on tasks, each with a level and a time estimate.
All module tasks →Video Explanation
Prefer video format? Watch this lesson with examples and explanations.
Comments