Что такое ошибка преобразования строки в ZonedDateTime

#java

Вопрос:

 import java.time.ZonedDateTime;  

public class ZonedDateTimeExample1{  
    
    public static void main(String[] args) {  
        ZonedDateTime zone = ZonedDateTime.parse("2016-10-05T08:20:10");  
        System.out.println(zone);  
    }  
}
 

Это приводит к

Ошибка преобразования строки в дату

Это String без часового пояса. Как преобразовать его в ZonedDateTime с добавлением часового пояса UTC.
Пожалуйста, дайте мне знать, почему часовой пояс по умолчанию не принимает ZonedDateTime.parse

Попадание ниже исключения:

 Exception in thread "main" java.time.format.DateTimeParseException: Text 2016-10-05T08:20:10 could not be parsed at index 19
 at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
 at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
 at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
 at java.time.ZonedDateTime.parse(ZonedDateTime.java:582)
 at ZonedDateTimeExample1.main(ZonedDateTimeExample1.java:4)
 

Комментарии:

1. Где в этом зона String ? Дата-время, которое вы пытаетесь проанализировать, не имеет зоны или смещения. Вам придется использовать LocalDateTime.parse(...) здесь, а затем прикрепить зону.

Ответ №1:

TL;DR См. код:

 public static void main(String[] args) throws Exception {
    ZonedDateTime zone = LocalDateTime.parse("2016-10-05T08:20:10")
                                      .atZone(ZoneId.of("Etc/UTC"));
    System.out.println(zone); 
}
 

Вы не можете напрямую анализировать a String , у которого нет часового пояса для a ZonedDateTime . Вы должны проанализировать его в LocalDateTime (дату и время дня без смещения или зоны), а затем присоединить зону.

В качестве альтернативы вы можете использовать ZoneId с DateTimeFormatter самим собой, например

 public static void main(String[] args) {
    DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_DATE_TIME
                                .withZone(ZoneId.of("Etc/UTC"));
    
    ZonedDateTime zdt = ZonedDateTime.from(dtf.parse("2016-10-05T08:20:10"));
    System.out.println(zdt);
}