TimeZoneConversion - CST для UTC - PullRequest
       1

TimeZoneConversion - CST для UTC

0 голосов
/ 24 января 2019

У меня есть значение даты в центральном времени

String cstDate = "02-ЯНВ-19 03.34.33.540260000 AM";

Мне нужно преобразовать вышеуказанную строкузначение в формате UTC.Я использую Java 1.8 и использовал ZonedDateTime.

Пожалуйста, найдите ниже код.

String DATE_FORMAT = "dd-MMM-yy hh.mm.ss.SSSSSSSSS a";      
String cstDate =  "02-JAN-19 03.34.33.540260000 AM";
LocalDateTime ldt = LocalDateTime.parse(cstDate,DateTimeFormatter.ofPattern(DATE_FORMAT));
ZonedDateTime utcDateTime = ldt.atZone(ZoneId.of("UTC"));        //CST+6
System.out.println("cst : " + cstDate);
System.out.println("utc : " + utcDateTime);

Но получается исключение: текст '02 -JAN-19 03.34.33.540260000 AM 'не может быть проанализирован с индексом 3

Не понимая, почему я получаю это исключение.

Спасибо

1 Ответ

0 голосов
/ 24 января 2019

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?

  • 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 .

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