Новый SimpleDateFormat("чч: мм а", Locale.getDefault()).parse("16:30 PM"), дающий исключение Unparseable
Странные вещи случаются в самые отчаянные времена.
Я испытываю немного странную вещь в этой строке кода
Date time = new SimpleDateFormat("hh:mm a", Locale.getDefault()).parse("04:30 PM");
дает
"Неразборчивая дата:"04:30 PM " (по смещению 6)
исключение только на устройствах Android 6.0 и Android 6.0.1, в производственном приложении (в Google Play Store).
PS: Я не могу восстановить эту ошибку на Android 6.0 Emulator и HTC Desire 10 Pro Android 6.0.1. Будем благодарны за любую помощь, чтобы восстановить эту ошибку локально или как обойти это.
Отредактировано: 15-Nov-2018 Устройства, дающие это исключение.
Версия ОС: 3.4.0-10662519 (G900FXXS1CQD8) Уровень API операционной системы: 23 Устройство: klte Модель (и продукт): SM-G900F (kltexx) Производитель: samsung Другие теги: ключи-релизы SD Состояние карты: смонтировано http.agent = Dalvik/2.1.0 (Linux; U; Android 6.0.1; SM-G900F Build/MMB29M)
Версия ОС: 3.10.84 (v1AJW-0) Уровень API ОС: 23 Устройство: idol4 Модель (и продукт): 6055K (6055K) Производитель: TCL Другие теги: ключи разблокировки Состояние SD-карты: смонтировано http.agent = Dalvik/2.1.0 (Linux; U; Android 6.0.1; 6055K Build/MMB29M)
Версия ОС: 3.10.84-g05b37ae (16293194481ff) Уровень API ОС: 23 Устройство: p1 Модель (и продукт): LG-H818 (p1_global_com) Производитель: LGE Другие теги: ключи-релизы SD Состояние карты: смонтировано http.agent = Dalvik/2.1.0 (Linux; U; Android 6.0; LG-H818 Build/MRA58K)
1 ответ
Смещение 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
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 используется версия Android ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
связи
- Учебник Oracle: Дата и время, объясняющие, как использовать
java.time
, - Запрос спецификации Java (JSR) 310, где
java.time
был впервые описан. - ThreeTen Backport проект, бэкпорт
java.time
в Java 6 и 7 (ThreeTen для JSR-310). - ThreeTenABP, Android-версия ThreeTen Backport
- Вопрос: Как использовать ThreeTenABP в Android Project, с очень подробным объяснением.