tl; dr
Ваше значение JAN
неправильно локализовано на английском языке, поэтому мы должны выполнить синтаксический анализ с использованием более персонализированного объекта DateTimeFormatter
, созданного с помощью шаблона , используя DateTimeFormatterBuilder
класс для анализа без учета регистра.
UTC
UTC не является «форматом». UTC - это базовая линия, по которой мы измеряем часовые пояса по всему миру.Все часовые пояса на несколько часов-минут-секунд опережают или отстают от UTC.Часовые пояса к востоку от демаркационной точки в Королевской обсерватории, Гринвич опережают UTC, а западные - позади.Смещение нуля - это само UTC.
LocalDateTime
В вашей входной строке отсутствует указатель часового пояса или смещения от UTC.Это плохая практика, поскольку ценность неоднозначна.Без зоны или смещения мы должны анализировать как LocalDateTime
объект.
Мы указываем шаблон форматирования, соответствующий вашему вводу.Кстати, ваш выбор формата входной строки не является оптимальным.По возможности используйте стандартные форматы ISO 8601 .
DateTimeFormatterBuilder
Введенное значение JAN
является неверной локализацией для США и Великобритании и, вероятно, для других.Поэтому мы не можем зависеть от обычного разбора.Мы должны указать синтаксический анализ с учетом регистра.Для этого мы должны создать a DateTimeFormatter
объект с использованием класса DateTimeFormatterBuilder
.
String input = "02-JAN-19 03.34.33.540260000 AM" ;
DateTimeFormatterBuilder builder =
new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern(
"dd-MMM-uu hh.mm.ss.SSSSSSSSS a"
) ;
DateTimeFormatter f = builder.toFormatter( Locale.US ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
ldt.toString (): 2019-01-02T03: 34: 33.540260
Отсутствие какой-либо концепции часового пояса или смещения от UTC означает, что нашLocalDateTime
это не момент, это не точка на временной шкале.Он представляет потенциальных моментов в диапазоне 26-27 часов (диапазон часовых поясов по всему миру).Чтобы определить момент, мы должны назначить смещение или зону.
ZonedDateTime
Вы утверждаете, что знаете, что эта входная строка должна была представлять момент в CST
.К сожалению, CST
не является реальным часовым поясом.Никогда не используйте эти 2-4-символьные псевдозоны, поскольку они не стандартизированы - они даже не уникальны!Вы имели в виду Китайское стандартное время ?Может быть Центральное стандартное время в Америке?
Зоны реального времени имеют имя в формате Continent/Region
.Я предполагаю, что вы имели в виду часовой пояс, такой как America/Chicago
.У вас есть комментарий, в котором упоминается смещение +6
… Вы имели в виду -06:00
, используемый America/Chicago
зимой?
ZoneId z = ZoneId.of( "America/Chicago" ) ;
Примените этот часовой пояс к нашему LocalDateTime
, чтобы получить ZonedDateTime
представляет фактический момент.
ZonedDateTime zdt = ldt.atZone( z ) ;
zdt.toString (): 2019-01-02T03: 34: 33.540260-06: 00 [Америка / Чикаго]
Чтобы увидеть тот же момент, что и в формате UTC, извлеките Instant
.Instant
представляет момент в UTC, всегда в UTC.
Instant instant = zdt.toInstant() ;
instant.toString (): 2019-01-02T09: 34: 33.540260Z
См. Этот код, запущенный в режиме реального времени на IdeOne.com .
OffsetDateTime
Ваш вопрос не был ясным.Если вы имели в виду, что входная строка, как известно, представляет момент в UTC, анализируйте ее как OffsetDateTime
.
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;
Настройка на America/Chicago
часовой пояс.Тот же момент, другое время настенных часов.
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 .