Как разобрать дату и время с часовым поясом, но без Т или наносекунд - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь проанализировать строку даты и времени в следующем формате:

2019-02-22 19:29:43+00:00

Я следую этому руководству: https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

Эта строка, похоже, является меткой временистрока, которую я пытаюсь проанализировать:

Z       zone-offset                 offset-Z          +0000; -0800; -08:00;

Вот что я создал, учитывая это руководство:

String input = "2019-02-22 19:29:43+00:00";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssX");
LocalDateTime parsed = LocalDateTime.parse(input, formatter);

Но я получаю эту ошибку:

 java.time.format.DateTimeParseException: Text '2019-02-22 19:29:43+00:00' could not be parsed, unparsed text found at index 22

Ответы [ 2 ]

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

tl; др

Неверный класс : OffsetDateTime, а не LocalDateTime.

Заменить пробел на Tдля стандартного формата, используемого по умолчанию.

OffsetDateTime.parse(               // Do NOT use `LocalDateTime` class, use `OffsetDateTime` because your input has an offset-from-UTC. 
    "2019-02-22 19:29:43+00:00"
    .replace( " " , "T" )           // Replace SPACE in middle with a `T` to comply with ISO 8601 standard format.
)                                   // Returns a `OffsetDateTime`.

См. этот код, запущенный в режиме реального времени на IdeOne.com.

Неверный тип

Ваша входная строка включает смещение от UTC .

Но вы пытаетесь разобрать это как LocalDateTime. A LocalDateTime не имеет понятия часовой пояс или смещение от UTC, потому что не представляет момент.Итак, квадратный колышек, круглое отверстие .Вы отбрасываете ценную информацию.

Вместо этого вы должны анализировать как OffsetDateTime.

ISO 8601

Ваша входная строка почти стандартна ISO 8601 формат.Для полного соответствия просто замените ПРОБЕЛ в середине на T.

String input = "2019-02-22 19:29:43+00:00".replace( " " , "T" ) ;

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

OffsetDateTime odt = OffsetDateTime.parse( input ) ;

О java.time

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

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

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

Вы можете обмениваться 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 голосов
/ 23 февраля 2019

Попробуйте yyyy-MM-dd HH:mm:ssXXX.Это должно решить вашу проблему.

Смещение X и x:

Одна буква выводит только час, например «+01», если минута не установленаненулевой, в этом случае также выводится минута, например, «+0130».

Две буквы выводят час и минуту без двоеточия, например, «+0130».

Три буквы выводят часы и минуты с двоеточием, например, «+01: 30».

Четыре буквы выводят час и минуту и ​​необязательную секунду без двоеточия, например «+013015».

Пять букв выводят часы и минуты и необязательную секунду с двоеточием, например «+01: 30: 15».

Шесть или более букв выбрасывает IllegalArgumentException.

Из описания под таблицей: https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

РЕДАКТИРОВАТЬ:

Если вы хотите отформатировать даты с этим шаблоном и хотите получить ту же строку вывода, вы должны использовать yyyy-MM-dd HH:mm:ssxxx вместо этого (см. Комментарий Андреаса ниже).

...