DateFormatter преобразовывает am / pm в a. m./p. м. на испанском - PullRequest
0 голосов
/ 29 июня 2018

Я выполняю синтаксический анализ с DateFormatter «Чт 28 июня 14:25:00 GMT + 03: 00 2018», и он правильно выдает 28 июня 2018 14:25:00. Однако, когда пользователь переключается на испанский язык, форматтер выдает jun. 28, 2018 2:25:00 с. м. Это нормально?

вот как я разбираю дату

    DateFormatter dateFormatter = new DateFormatter();
    dateFormatter.setDateFormatPattern("MMM dd, yyyy hh:mm:ss a");
    mCalendar = new GregorianCalendar(mTimeZone);
    mCalendar.setTime(date);
    mSimpleDateFormat.applyPattern(pattern);
    mSimpleDateFormat.setTimeZone(mTimeZone);

    mSimpleDateFormat.format(mCalendar.getTime());

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Γεια σου. Я считаю, что vguzzi ответ правильный. Я хотел бы добавить два сообщения:

  • Избегайте устаревших классов GregorianCalendar, Date, TimeZone и общеизвестно хлопотных SimpleDateFormat. Вместо этого используйте java.time, современный Java-интерфейс даты и времени.
  • Используйте встроенные локализованные форматы, а не сворачивайте собственные, чтобы намного лучше соответствовать ожиданиям местной аудитории.

Пример кода:

    DateTimeFormatter originalFormatter
            = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ROOT);
    DateTimeFormatter userFormatter 
            = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
    String originalDateTimeString = "Thu Jun 28 14:25:00 GMT+03:00 2018";
    ZonedDateTime dateTime = ZonedDateTime.parse(originalDateTimeString, originalFormatter);
    String formattedDateTime = dateTime.format(userFormatter);
    System.out.println(formattedDateTime);

При запуске в локали США печатается результат, похожий на ваш:

28 июня 2018 г., 14:25:00

Британский язык уже немного отличается:

28 июня 2018 г., 14: 25: 00

Есть английский и английский. И Java знает, что испанский также не использует AM и PM:

28 июня. 2018 14: 25: 00

Для меня было неожиданностью узнать, что греческий делает:

28 сентября 2018 г., 2:25:00 мкм.

Примеры выходных данных взяты из кода, работающего на моей Java 9. Данные локали на Android могут отличаться, что дает несколько иной вывод в некоторых случаях, но все же хорошо подходит для разных локальных аудиторий.

Вопрос: Могу ли я использовать java.time на Android?

Да, java.time прекрасно работает на старых и новых устройствах Android. Просто требуется хотя бы Java 6 .

  • В Java 8 и более поздних версиях и на более новых устройствах Android (от 26 уровня API, как мне сказали) современный API встроен.
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На (более старых) Android используется версия Android ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

0 голосов
/ 29 июня 2018

Это правильное представление. Например, сравните строки Испанский AM / PM и Строки Итальянский AM / PM. Вы увидите, что испанский - это p.m, а итальянский - PM.

Хотя вы можете сослаться на этот ответ Quora, в котором говорится, что испанское время всегда представлено в 24-часовом формате.

...