Java Joda время не может проанализировать DateTimeFormat :: longTime - PullRequest
0 голосов
/ 24 сентября 2018

Я недавно столкнулся с Джодой, и у меня возникли проблемы с синтаксическим анализом LocalTime, как показано на простом фрагменте:

String localTimeString = LocalTime.now().toString(dateTimeFormatter);
LocalTime localTime = LocalTime.parse(localTimeString, dateTimeFormatter);

Результаты варьируются в зависимости от используемого DateTimeFormatter:

  1. DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("HH:mm:ss");
  2. DateTimeFormatter dateTimeFormatter = DateTimeFormat.longTime();

Я удивлен результатом:

  1. Первыйработает нормально, localTimeString имеет значение 13:23:45 и печать проанализированного localTimeString дает 13:23:45.000 правильно.
  2. Здесь я борюсь.localTimeString равно 1:23:45 PM, однако следующая строка приводит к исключению:

    java.lang.IllegalArgumentException: Неверный формат: «1:23:45 PM» слишком короткий

Ни одного подобного вопроса я не нашел, ни Joda JavaDoc не помогли мне.

Почему DateTimeFormat::longTime не может разобрать себя?Полагаю, я что-то не так делаю - что это?

1 Ответ

0 голосов
/ 29 сентября 2018

Я действительно не знаю Joda-Time, но у меня есть предположение, которое звучит компетентно в моих собственных ушах.Я попробовал это:

    DateTimeFormatter dateTimeFormatter 
            = DateTimeFormat.longTime().withLocale(Locale.US);

    String timeString = DateTime.now().toString(dateTimeFormatter);
    System.out.println("timeString: \"" + timeString + '"');

На моем компьютере в часовом поясе Европы / Копенгагена он только что напечатал:

timeString: "3:19:09 PM CEST"

Так что, похоже, DateTimeFormat.longTime() включает сокращение часового пояса (здесь CEST для Центрально-Европейского Летнего времени).Очевидно, что в вашем коде происходит следующее:

  • Поскольку LocalTime не включает часовой пояс, его метод toString форматирует время с пустой строкой как сокращение часового пояса.Он включает в себя пространство между временем и тем, где должно быть сокращение часового пояса.В исключении, которое вы цитируете (а также когда я воспроизводю его здесь), после PM.
  • LocalTime.parse есть пробел, более строгий и возражающий против отсутствия аббревиатуры часового пояса в строке.
...