Преобразование даты и времени между часовыми поясами

Научитесь преобразовывать заданный объект даты-времени из одного часового пояса в другой часовой пояс. Мы увидим примеры с использованием классов 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

Исходный код на Github

Прокрутить вверх