Пояснение
Вы используете шаблон hh
для часов. Это требует двухзначных часов, например 12
или 03
. Но ваш ввод представляет собой одну цифру, 3
для поля часа.
Решение
Либо настройте ваши входные данные, чтобы они были двухзначными, поэтому 03
вместо 3
,Или используйте шаблон, который в порядке с одной цифрой, которая будет просто h
.
Из официальной документации :
ч, часычас ночи (1-12), число, 12
число: если количество букв равно единице, то значение выводится с использованием минимального количества цифр и без дополнения. В противном случае, count цифр используется как width поля вывода, со значением с добавлением нуля при необходимости. Следующие буквы шаблона имеют ограничения на количество букв. Можно указать только одну букву «с» и «F». Можно указать до двух букв «d», «H», «h», «K», «k», «m» и «s». Можно указать до трех букв «D».
Примечания
Вы можете упростить свой код и уменьшить дублирование, удалив единственную отличающуюся часть, а именно входную строку. И поскольку вы возвращаете свой if
, else
не требуется. Вы также можете еще больше упростить и сделать код более читабельным, разбив некоторые вложенные операторы и поместив их в переменные. Вы также должны добавить быстрый комментарий, чтобы объяснить, что происходит:
DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("hh:mm a", Locale.US);
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("HH:mm", Locale.US);
// Patch time without minutes, 3 AM to 3:00 AM
String withoutAM = checkinCheckoutTime.replaceAll("AM", "").trim();
boolean hasOnlyHours = withoutAM.length() == 1 || withoutAM.length() == 2;
String timeInput = hasOnlyHours ? withoutAM + ":00 AM" : checkinCheckoutTime;
return LocalTime.parse(timeInput, inputFormatter)
.format(outputFormatter);
Обратите внимание, что ваш код не будет работать для таких вводов, как 3 PM
, поскольку вы удаляете только AM
. Вы можете просто добавить еще один вызов, чтобы также удалить PM
или поместить оба в одно регулярное выражение, так как вы используете вместо регулярного выражения replaceAll
вместо не-регулярного выражения replace
в любом случае:
String withoutSuffix = checkinCheckoutTime.replaceAll("(AM|PM)", "").trim();
А проверку длины можно упростить до <= 2
(пустой ввод в любом случае завершится неудачей на этапе анализа).