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