Идентификатор часового пояса в Java
ZoneId связывает календарное время с правилами
смещения для региона. Имя вроде Europe/Moscow
учитывает переход на летнее время там, где он есть.
Фиксированный сдвиг задают через ZoneOffset,
но для городов обычно берут именованную зону.
Пояс JVM читают systemDefault. Конкретный
регион создают of со строкой из базы IANA:
import java.time.ZoneId;
public class Main {
public static void main(String[] args) {
ZoneId local = ZoneId.systemDefault();
ZoneId moscow = ZoneId.of("Europe/Moscow");
System.out.println(local);
System.out.println(moscow);
}
}
Универсальный момент переводят в локальные часы через
atZone. Текущее смещение для зоны на дату
можно прочитать отдельно:
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
ZoneId tokyo = ZoneId.of("Asia/Tokyo");
ZonedDateTime there = Instant.now().atZone(tokyo);
System.out.println(there.getHour());
System.out.println(there.getOffset());
}
}
Неверное имя зоны приводит к исключению при
создании. Список доступных идентификаторов лежит
в ZoneId.getAvailableZoneIds, но в программе
обычно хранят заранее известные константы или
настройку пользователя.
Выведите системный идентификатор часового пояса.
Создайте зону Europe/Moscow, переведите в
нее текущий момент и выведите часы.