Java 8 LocalDateTime имеет разные результаты - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь обновить код, чтобы использовать функцию Java 8 для анализа нескольких форматов дат.мое местное время на моем ящике установлено на UTC-11 .

. При использовании SimpleDateformat работает приведенный ниже код.

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
Date correctDate = dateFormat.parse("2018-09-6T03:28:59.039-04:00");

//Gives me correct date  
System.println( correctDate);//Wed Sep 5th 20:28:59 GMT-11:00 2018

Я пытаюсь обновить этот кодчтобы дать ту же дату, что и выше, с DateTimeFormatter в Java 8, чтобы я мог обрабатывать другой формат даты ..

DateTimeFormattter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[.SSS]XXX");
LocalDateTime updateDate = LocalDateTime.parse( "2018-09-6T03:28:59.039-04:00", dtf);

//shows the wrong date of 2018-09-06 03:28:59.039.
System.out.println( updateDate.toString() );// 2018-09-06 03:28:59.039

[решено] Я смог исправить это с помощью ZonedDateTime.

ZonedDateTime zdt = ZonedDateTime.parse("2018-09-6T03:28:59.039-04:00");
zonedDateTime = zdt.withZoneSameInstance(ZoneId.of("GMT"));

Date correctDate = Date.from( zonedDateTime.toInstance());

// correctDate - это то, что я хотел Ср 5 сентября 20:28:59 GMT-11: 00 2018

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Решено с использованием OffsetDateTime, как предложено в принятом «Ответе»:

OffsetDateTime odt = OffsetDateTime.parse («2018-09-6T03: 28: 59.039-04: 00»);
ДатаcorrectDate = Date.from (odt.toInstant ());

0 голосов
/ 22 октября 2018

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

Документация из LocalDateTime четко объясняет это:

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

Вам следует рассмотреть возможность использования OffsetDateTime или ZonedDateTime.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...