Введение в продвинутую работу с датой и временем в Java
В базовом разделе про java.time уже встречались
LocalDate, LocalTime и
LocalDateTime. Они описывают календарь и часы
без привязки к региону. Так удобно хранить день рождения
или расписание в одном городе.
Когда данные уходят на сервер, в лог или в базу для разных стран, одной локальной отметки мало. Нужен универсальный момент на шкале UTC и явный часовой пояс, чтобы восстановить местное время у получателя.
В этом разделе соберем продвинутую часть пакета
java.time для Java 27. Разберем момент
Instant, точную Duration и календарный
Period, идентификатор ZoneId и полную
отметку ZonedDateTime, перевод между поясами,
запись и чтение строк.
Объекты по-прежнему неизменяемы: любой сдвиг или смена
пояса возвращает новое значение. Старые типы
Date и Calendar в новом коде не
используем.
Короткая карта типов для ориентира:
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
Instant now = Instant.now();
LocalDate day = now.atZone(ZoneId.systemDefault()).toLocalDate();
ZonedDateTime zoned = ZonedDateTime.now(ZoneId.of("UTC"));
System.out.println(now);
System.out.println(day);
System.out.println(zoned);
}
}
Первая строка - секунды с эпохи без календарной привязки. Вторая - только дата в системном поясе. Третья - полная отметка с указанием UTC. Дальше разберем каждый слой подробнее.