DateTimeParseException при синтаксическом анализе строки в LocalDateTime - PullRequest
0 голосов
/ 14 февраля 2019

Отлично работает следующее:

String startDate = "2019-10-12T00:00:00.000-07:00"

LocalDateTime startDateTime = LocalDateTime.parse(startDate,
    DateTimeFormatter.ISO_ZONED_DATE_TIME);

Однако для следующего кода:

String startDate = "2019-10-12T00:00:00.000+07:00"

LocalDateTime startDateTime = LocalDateTime.parse(startDate,
    DateTimeFormatter.ISO_ZONED_DATE_TIME);

Я получаю исключение:

throws java.time.format.DateTimeParseException: Текст «2019-10-12T00: 00: 00.000 07:00» не может быть проанализирован по индексу 23

Может кто-нибудь помочь мне понять, что здесь может быть не так?

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Я попытался запустить обе даты локально с одним и тем же разбором LocalDateTime, и они обе работают правильно .

Я мог бы воссоздать ту же ошибку, используя другую дату (примечание пробел со смещением зоны вместо + или -) 2019-10-12T00:00:00.000 07:00 вместо 2019-10-12T00:00:00.000+07:00.Что показывает ваше сообщение об ошибке (но не то, что есть в вашем коде).

Вы уверены, что указанная версия кода, использующая 2019-10-12T00:00:00.000+07:00, является действительной версией, которая вызывает ошибку?Похоже, вы использовали 2019-10-12T00:00:00.000 07:00, что затем приводит к ошибке.

0 голосов
/ 14 февраля 2019

tl; dr

(A) Как отмечается в комментарии Andreas , исчезновение вашего символа + в сообщении об ошибке является подозрительным.Вероятно, у вас проблема с кодировкой символов.У нас здесь недостаточно информации для диагностики этого.

(B) Используйте OffsetDateTime вместо LocalDateTime, чтобы соответствовать вашим данным.

OffsetDateTime
.parse( "2019-10-12T00:00:00.000+07:00" )
.toInstant()
.toString()

2019-10-11T17: 00: 00Z

См. Этот код, запущенный в прямом эфире на IdeOne.com .

LocalDateTime - неправильный класс

В классе LocalDateTime отсутствует понятие часового пояса или смещения от UTC.Так что по определению он не может представлять момент.A LocalDateTime объект не точка на временной шкале.

Тем не менее, ваша входная строка указывает на смещение от UTC, +07:00 в 2019-10-12T00:00:00.000+07:00.Ваша попытка поместить это значение в LocalDateTime не подходит, квадратный колышек в круглом отверстии .

Никогда не используйте LocalDateTime, когда вы имеете в виду определенный момент, конкретную точкуна временной шкале.Этот класс почти никогда не используется в бизнес-ориентированных приложениях в настоящее или в прошлые моменты.При назначении встреч в будущем этот класс следует использовать, когда вы хотите, чтобы время дня оставалось неизменным, независимо от того, как политики переопределяют часовой пояс региона.

OffsetDateTime

Parseкак OffsetDateTime объект.

Ваша входная строка полностью соответствует стандарту ISO 8601 для текстовых форматов даты и времени.Классы java.time по умолчанию используют эти форматы при разборе / генерации строк.Поэтому нет необходимости указывать шаблон форматирования.

String input = "2019-10-12T00:00:00.000+07:00" ;
OffsetDateTime odt = OffsetDateTime.parse( input ) ;

UTC

Чтобы настроить время настенного времени на UTC (смещение нуля), позвоните OffsetDateTime::withOffsetSameInstant.Для вашего удобства используйте константу ZoneOffset.UTC.

OffsetDateTime odtUtc = odt.withOffsetSameInstant( ZoneOffset.UTC ) ;

Или просто извлечь объект базового класса строительных блоков в java.time , Instant.Instant всегда в UTC, по определению.

Instant instant = odt.toInstant() ;

ZonedDateTime

Чтобы увидеть тот же момент, который просматривается через время настенных часов, использованноелюдьми определенного региона (часового пояса), примените ZoneId, чтобы получить ZonedDateTime.

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

О java.time

Фреймворк java.time встроен в Java 8и позже.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами непосредственно с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесены в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации связки Android java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

Проект ThreeTen-Extra расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 14 февраля 2019

в startDateTime есть дополнительный ноль. StartDateTime = "2019-10-12T00: 00: 00.00 + 07: 00"

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