новый SimpleDateFormat ("чч: мм а", Locale.getDefault ()). parse ("16:30 PM"), дающий исключение Unparseable - PullRequest
0 голосов
/ 15 ноября 2018

Странные вещи случаются в самые отчаянные времена.

Я испытываю немного странную вещь в этой строке кода

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 и HTC Desire 10 Pro Android 6.0.1.Буду признателен за любую помощь, чтобы восстановить эту ошибку локально или как обойти ее.

Отредактировано: 15-Nov-2018 Устройства, предоставляющие это исключение.

Версия ОС: 3.4.0-10662519 (G900FXXS1CQD8) Уровень API операционной системы: 23 Устройство: klte Модель (и продукт): SM-G900F (kltexx) Производитель: samsung Другие TAGS: ключи выпуска 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 Ответ

0 голосов
/ 15 ноября 2018

Смещение 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 с подпакетами.

Ссылки

...