Смещение 6 вашей строки - это то, где написано PM
.
Это проблема локали.AM
и PM
, хотя и производные от латыни, называются так на английском, а не на многих других языках.Поэтому эти сокращения не признаются в очень многих регионах.В вашем коде вы используете Locale.getDefault()
, и если он возвращает неанглоязычный язык, вы, скорее всего, получите ошибку.Попробуйте, например, Locale.ENGLISH
.В качестве альтернативы убедитесь, что вы получили строку в правильном формате и языке для локали по умолчанию.
java.time
Если вы выполняете значительную работу со временем или датами в своем приложении, а такжедля тех, кто программирует для Java 8 или более поздней версии или для Android API уровня 26 или более поздней версии: используемые вами классы Date
и SimpleDateFormat
всегда имели проблемы с дизайном, в частности последний, как правило, проблематичен.К счастью, оба они давно устарели и заменены на java.time, современный Java-интерфейс даты и времени.Поэтому используйте это вместо:
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH);
LocalTime time = LocalTime.parse("04:30 PM", timeFormatter);
System.out.println(time);
Вывод:
16: 30
A LocalTime
- это время дня без даты и безчасовой пояс и, кажется, соответствует вашим потребностям гораздо лучше, чем старомодный Date
класс.
Вопрос: Могу ли я использовать java.time на Android?
Да, java.time работает хорошона старых и новых устройствах Android.Для этого требуется как минимум Java 6 .
- В Java 8 и более поздних версиях и на более новых устройствах Android (от уровня API 26) современный API поставляется встроенным.
- В Java 6 и 7 получают ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310; см. Ссылки внизу).
- На (более старых) Android используется версия ThreeTen для AndroidBackport.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Ссылки