Преобразование моей строки в LocalTime с помощью шаблонов

Я хотел преобразовать свою строку в формат LocalTime

    String s = "1時30分:00";
    String ss = s.replace("時", ":").replace("分", ":");
    DateTimeFormatter timeColonFormatter = new DateTimeFormatterBuilder().parseCaseInsensitive().appendPattern("hh:mm a").toFormatter(Locale.JAPAN);
    System.out.println(timeColonFormatter);
    LocalTime colonTime = LocalTime.parse("3:30 am", timeColonFormatter);
    System.out.println(colonTime);

Я получил ошибку:

Исключение в потоке «main» java.time.format.DateTimeParseException: текст «3:30» не может быть проанализирован с индексом 0

Ожидаемый результат:

3:30 AM


person Anonymous    schedule 03.07.2019    source источник
comment
Связана ли строка s с этим каким-либо образом?   -  person Sweeper    schedule 03.07.2019
comment
вы пробовали с 03:30?   -  person Stultuske    schedule 03.07.2019
comment
Я сделал s для себя. Из-за постоянных ошибок. В итоге я ввел ввод напрямую и по-разному.   -  person Anonymous    schedule 03.07.2019
comment
Да, я пробовал 03:30, но все равно не работает   -  person Anonymous    schedule 03.07.2019
comment
вы пропустили am-pm-of-day в своей строке. Это часть узора   -  person Jens    schedule 03.07.2019
comment
Да, но проблема здесь в том, что я включаю am или pm, например, 03:30 am, а затем в шаблоне - ›чч: мм a. Я все еще получаю ту же ошибку.   -  person Anonymous    schedule 03.07.2019
comment
am-pm-of-day зависит от локали, поэтому я предполагаю, что для этого должен быть японский знак. если я меняю языковой стандарт на английский, чем он работает. См. Также japanese.stackexchange.com/questions/44319. /   -  person Jens    schedule 03.07.2019
comment
Да, я тоже это понимаю. Моя текущая проблема заключается в том, что я не знаю, что назначить этому пустому пространству, чтобы заменить am или pm в Locale.US. Я попытался проверить ввод из документации, и он показывает тип данных .Short. Я не знаю, какой короткий тип данных включить.   -  person Anonymous    schedule 03.07.2019
comment
В Locale.US он отлично работает без каких-либо проблем, так как есть много примеров, на которые нужно ссылаться, но не для японской версии и других языков.   -  person Anonymous    schedule 03.07.2019
comment
Почему вы хотите заменить японский символ на символы США? Он также должен работать с японскими символами и языками Японии.   -  person Jens    schedule 03.07.2019


Ответы (1)


В вашем шаблоне у вас есть двузначный час, и, поскольку ваш регион - Япония, вы должны использовать японский эквивалент AM / PM, то есть 午前 / 午後, соответственно, например:

LocalTime.parse("03:30 午前", timeColonFormatter);
LocalTime.parse("03:30 午後", timeColonFormatter);

Вы также можете принять однозначное время с помощью шаблона "h:mm a".

Изменить: вы также можете напрямую анализировать японское время без необходимости конвертировать в полу-международный формат, например. используя шаблон "h時mm分 a":

LocalTime colonTime = LocalTime.parse("3時30分 午前", timeColonFormatter);

Или, в правильном японском порядке, с шаблоном "ah時mm分":

LocalTime colonTime = LocalTime.parse("午前3時30分", timeColonFormatter);
person vlumi    schedule 03.07.2019
comment
Теперь я понимаю. Извините, я тестирую на многих других языках, поэтому не заметил этой простой ошибки. Большое вам спасибо, сэр - person Anonymous; 03.07.2019
comment
Таким образом, невозможно заставить его печатать AM после строки. - person Anonymous; 03.07.2019
comment
AM на японском означает 午前, который используется, если вы устанавливаете локаль на JAPAN. - person vlumi; 03.07.2019
comment
Вау, это даже лучше. Большое спасибо! - person Anonymous; 03.07.2019
comment
Я хочу задать последний вопрос. Можно ли преобразовать вывод 03:30 - ›03:30:00. С его секундами, установленными на 00? - person Anonymous; 03.07.2019
comment
То, что вы там печатаете, - это просто форматирование по умолчанию LocalTime. Вы можете отформатировать его как хотите, например используя DateTimeFormatter, созданный ранее: timeColonFormatter.format(colonTime). Вы также можете получить формат времени ISO 03:30:00: DateTimeFormatter.ISO_TIME.format(colonTime) - person vlumi; 03.07.2019
comment
Я попытался использовать это как-то все полученные ошибки. .format вернет исходную строку. - person Anonymous; 03.07.2019
comment
Ваш timeColonFormatter вернет тот же формат (он используется как для синтаксического анализа, так и для форматирования), но стандартный DateTimeFormatter.ISO_TIME должен дать вам hh:mm:ss. - person vlumi; 03.07.2019