Дата и время

Базовый Java
≈ 2 мин чтения

Время в программе — это не одно число

Дата рождения, время встречи, момент отправки запроса и «через два часа» выглядят похожими, но в коде означают разные вещи. Одним значениям нужен только календарный день, другим — точный момент на общей временной шкале, третьим — ещё и правила конкретного часового пояса. Пакет 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"));

Все три значения связаны со временем, но отвечают на разные вопросы. Именно умение выбрать правильный тип будет главной опорой всего раздела.