Дата и время
Время в программе — это не одно число
Дата рождения, время встречи, момент отправки запроса и «через два часа» выглядят похожими,
но в коде означают разные вещи. Одним значениям нужен только календарный день,
другим — точный момент на общей временной шкале, третьим — ещё и правила конкретного часового пояса.
Пакет java.time разделяет эти задачи на отдельные типы,
чтобы смысл значения был понятен прямо из кода.
В этом разделе мы соберём цельную модель работы со временем: от локальных дат и времени до абсолютных временных меток, часовых поясов, интервалов, форматирования и общих интерфейсов Temporal API. В конце отдельно посмотрим на старые классы, которые всё ещё встречаются в существующих проектах.
Что будет внутри раздела
- LocalDate, LocalTime и LocalDateTime. Разберём значения без часового пояса: календарную дату, время суток и их комбинацию.
- Instant и временные метки. Научимся представлять конкретный момент на общей временной шкале и работать с epoch-time.
- ZoneId и ZonedDateTime. Добавим часовые пояса и увидим, почему простого смещения вроде
+03:00иногда недостаточно. - Duration и Period. Разделим точную длительность во времени и календарный промежуток в годах, месяцах и днях.
- DateTimeFormatter. Научимся превращать даты и время в текст и обратно без ручной сборки строк.
- Операции с датой и временем. Посмотрим на добавление, вычитание, сравнение и вычисление расстояния между значениями.
- Temporal API. Свяжем знакомые классы через общие интерфейсы, единицы, поля и готовые корректировки дат.
- Старый Date API. Разберём, как читать код с
Date,CalendarиSimpleDateFormatи переходить к современному API.
Порядок важен: сначала нужно понять, какое именно значение времени хранит каждый основной класс, а затем уже выполнять над ним операции, форматировать и обобщать через Temporal API. Так код вроде «встреча в 10:00 по Берлину» и «запрос был отправлен в этот момент» не будет случайно храниться одним и тем же способом.
LocalDate birthday = LocalDate.of(2000, 5, 12);
Instant sentAt = Instant.now();
ZonedDateTime meeting = ZonedDateTime.now(ZoneId.of("Europe/Berlin"));
Все три значения связаны со временем, но отвечают на разные вопросы. Именно умение выбрать правильный тип будет главной опорой всего раздела.