Преобразовать LocalDateTime в любом из часовых поясов в любой часовой пояс в Java

#java #java-time

#java #java-time

Вопрос:

  • Предположим, что мой 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.atZone(ZoneId) чтобы получить ZonedDateTime , затем withZoneSameInstant преобразовать в другую зону.

2. Что вы уже пробовали и что не работает? Не могли бы вы, пожалуйста, опубликовать это?

3. Имейте в виду, что LocalDateTime не содержит информации о часовом поясе или смещении, это просто год, месяц, день, часы, минуты, секунды, миллисекунды и так далее. Вы должны знать и передавать ZoneId , если хотите надежное преобразование в UTC.

4. Знаете ли вы, каковы часовые пояса в каждом конкретном случае?

5. В качестве альтернативы вы могли бы использовать ZonedDateTime localNow = ZonedDateTime.now() в первую очередь, потому что это займет ZoneId.systemDefault() внутренне. После этого просто сделайте ZonedDateTime utcNow = localNow.withZoneSameInstant(ZoneId.of("UTC"))

Ответ №1:

Я не рекомендую использовать LocalDateTime для даты и времени at в часовом поясе. ZonedDateTime есть класс для этого. A 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 отслеживает часовой пояс каждого объекта даты и времени, что значительно затрудняет ошибки при преобразованиях. Преимущество, которое трудно переоценить.