Преобразование LocalDateTime в любой часовой пояс в любой часовой пояс в Java

  • Предположим, мой LocalDateTime в IST, т.е. (2020-08-14T15:41)
  • Необходимо преобразовать этот IST LocalDateTime в любой часовой пояс, скажем, от IST до UTC

Обязательный вывод: 2020-08-14T10:11 // означает 10:11, пятница, 14 августа 2020 г.

Если есть LocalDateTime из любого пояса, тогда будет получено время UTC, соответствующее времени UTC относительно времени любого часового пояса.

Получил общее решение для преобразования LocalDateTime из любого часового пояса в любой часовой пояс:

    LocalDateTime localDateTimeOfFromTimeZone = LocalDateTime.now();//it's takes your default application LocalDateTime
    
    System.out.println("From LocalDateTime : "+localDateTimeOfFromTimeZone);
    
    ZonedDateTime fromTimeZonedDateTime = localDateTimeOfFromTimeZone.atZone(fromTimeZoneId);
    
    LocalDateTime localDateTimeOfToTimeZone = LocalDateTime.from(fromTimeZonedDateTime.withZoneSameInstant(toTimeZoneId));
    
    System.out.println("Converted To LocalDateTime :"+localDateTimeOfToTimeZone);

Или

    LocalDateTime newDateTime = oldDateTime.atZone(oldZone).withZoneSameInstant(newZone).toLocalDateTime();

1 ответ

Я не рекомендую использовать LocalDateTime для даты и времени в часовом поясе. ZonedDateTimeкласс для этого. АLocalDateTimeэто точно дата и время без часового пояса.

    ZoneId fromTimeZoneId = ZoneId.of("Asia/Kolkata");
    ZoneId toTimeZoneId = ZoneId.of("Etc/UTC");
    
    ZonedDateTime dateTimeOfFromTimeZone = ZonedDateTime.now(fromTimeZoneId);
    System.out.println("From ZonedDateTime:         " + dateTimeOfFromTimeZone);

    ZonedDateTime dateTimeOfToTimeZone
            = dateTimeOfFromTimeZone.withZoneSameInstant(toTimeZoneId);
    System.out.println("Converted To ZonedDateTime: " + dateTimeOfToTimeZone);

Вывод, когда я только что запустил код:

From ZonedDateTime:         2020-08-15T00:13:19.519646+05:30[Asia/Kolkata]
Converted To ZonedDateTime: 2020-08-14T18:43:19.519646Z[Etc/UTC]

Когда используешь ZonedDateTime скорее, чем LocalDateTime, Java отслеживает часовой пояс каждого объекта даты и времени, что значительно усложняет возможность ошибок при преобразованиях. Преимущество, которое сложно переоценить.

Другие вопросы по тегам