Научитесь преобразовывать заданный объект даты-времени из одного часового пояса в другой часовой пояс. Мы увидим примеры с использованием классов ZonedDateTime, Date и Calendar .
1. Изменение часовых поясов ZonedDateTime
В Java 8 дата и время с информацией о часовом поясе представлены с помощью ZonedDateTime. Чтобы преобразовать экземпляр ZonedDateTime из одного часового пояса в другой, выполните два шага:
- Создайте ZonedDateTime в 1-м часовом поясе. Возможно, он уже есть в вашем приложении.
- Преобразуйте первый ZonedDateTime во второй часовой пояс, используя метод withZoneSameInstant().
ZonedDateTime instant = ZonedDateTime.now();System.out.println(instant);ZonedDateTime instantInUTC = instant.withZoneSameInstant(ZoneId.of("UTC"));System.out.println(instantInUTC);
Вывод программы.
2022-02-16T18:36:14.509742500+05:30[Asia/Calcutta]2022-02-16T13:06:14.509742500Z[UTC]
Подробнее: Преобразование даты в часовой пояс EST/EDT
2. Изменение часовых поясов OffsetDateTime
Подобно ZonedDateTime, OffsetDateTime также представляет момент в универсальной временной шкале со смещением от UTC/Гринвича в календарной системе ISO-8601. Чтобы преобразовать экземпляр OffsetDateTime из одного часового пояса в другой, выполните два шага:
- Создайте OffsetDateTime в 1-м часовом поясе. Возможно, он уже есть в вашем приложении.
- Преобразуйте первый OffsetDateTime во второй часовой пояс, используя метод withOffsetSameInstant().
OffsetDateTime now = OffsetDateTime.now();System.out.println(now);OffsetDateTime nowInUTC = now.withOffsetSameInstant(ZoneOffset.of( "00:00" ));System.out.println(instantInUTC);
Вывод программы.
2022-02-16T18:36:14.509742500+05:302022-02-16T13:06:14.509742500Z[UTC]
3. Изменение часовых поясов java.util.Date
- java.util.Date представляет момент времени без информации о часовом поясе.
- Он отображает только общее время с начала эпохи в миллисекундах.
- Очень важно понимать, что по умолчанию, если мы печатаем объект Date, он всегда будет печатать информацию о дате и времени вместе с текущим часовым поясом системы. Это вводящее в заблуждение поведение, поскольку оно предполагает, что объекты Date могут иметь информацию о часовом поясе, что неверно.
Правильный способ работы с экземпляром Date в разных часовых поясах — это печать информации о дате в других часовых поясах с помощью класса SimpleDateFormat. Не стоит корректировать момент на временной шкале , корректируя смещение зоны в миллисекундах объекта Date.
SimpleDateFormat FORMATTER = new SimpleDateFormat("MM/dd/yyyy 'at' hh:mma z");//In Default TimezoneDate currentDate = new Date();//Date in current timezoneSystem.out.println(FORMATTER.format(currentDate));//In UTC TimezoneTimeZone utcTimeZone = TimeZone.getTimeZone("UTC");FORMATTER.setTimeZone(utcTimeZone);String sDateInUTC = FORMATTER.format(currentDate);System.out.println(sDateInUTC);
Вывод программы.
02/16/2022 at 06:36pm IST02/16/2022 at 01:06pm UTC