Новый 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 с подпакетами.

связи

Другие вопросы по тегам