Мне нужно получить локализованный DateFormat на основе countryCode. Но США возвращает дд / мм / гггг - PullRequest
2 голосов
/ 11 июня 2019

Это мой код:

   try {
        Locale loc = new Locale("", countryCode);
        DateFormat formatter = DateFormat.getDateInstance(DateFormat.SHORT, loc);
        String pattern = ((SimpleDateFormat) formatter).toPattern();
        format = pattern;
        if (!format.contains("yyyy"))
            format = format.replace("y", "yyyy");
    } catch (Exception e) {
        Log.e("date", "Error trying to get date from Locale:" + e.getMessage());
    }

Теперь я устанавливаю локаль на основе кода страны. Это возвращает меня к «нас» displayCountryName как «United Stated», так что я знаю, что локаль верна. Но локаль возвращает «дд / мм / у» Почему?

Редактировать

Мне нужно, чтобы мой минимальный API был равен 22., поэтому я не могу использовать функцию Java8: DateTimeFormatter.ofLocalizedDate(dateStyle); Потому что просит минимум 26

Кроме того, мне нужен локализованный формат даты, основанный на коде страны , который я отправил. У меня есть список стран, пользователь выбирает одну, и мне нужно показать время и формат даты

Чтобы добавить больше контекста, я загружаю список следующим образом:

  private void createCountriesHashmap() {
    for (String iso : Locale.getISOCountries()) {
        Locale l = new Locale("", iso);
        map.put(l.getDisplayCountry(), iso);
        if (l.getDisplayCountry().trim().length() > 0 && !countries.contains(l.getDisplayCountry())) {
            countries.add(l.getDisplayCountry());
        }
    }
    Collections.sort(countries);
}

Когда я выбираю объект оттуда, я получаю код страны. Я использую код страны для создания локали: Locale loc = new Locale("", countryCode); Мне нужен формат даты этой страны. Не моя страна

Ответы [ 3 ]

1 голос
/ 12 июня 2019

Благодаря комментарию @MenoHochschild.Мне удалось заставить его работать так:

   Locale loc = new Locale("", countryCode);
        Locale[] locales = java.text.DateFormat.getAvailableLocales();
        for (Locale locale : locales) {
            if (locale.getCountry().contains(countryCode)) {
                loc = locale;
                break;
            }
        }
        DateFormat formatter = DateFormat.getDateInstance(DateFormat.SHORT, loc);
        String pattern = ((SimpleDateFormat) formatter).toPattern();
1 голос
/ 12 июня 2019

Не совсем понятно, привязан ли локализованный формат даты к языку или к стране.Мне кажется, это чаще всего связано с языком или комбинацией обоих.Поэтому, когда вы запрашиваете краткий формат даты для локали без языка (только для страны), вы очень часто получаете y-MM-dd, который является международным форматом короткой даты по умолчанию.

В моем Java 11 есть 6(шесть) доступных локалей для Соединенных Штатов, и они, как правило, предоставляют разные форматы коротких дат:

  • lkt_US ( Lakota , язык сиу) дает y-MM-dd (по умолчанию во всем мире)
  • es_US (испанский) и haw_US ( гавайский ) дают d/M/yy
  • en_US_POSIX, en_US и chr_US( Чероки ) дают M/d/yy

Поэтому я полагаю, что все вышеперечисленное будет правильным ответом для короткого формата даты в США.И я верю, что код в вашем собственном ответе даст вам один из них.Реальный вопрос в том, какой из них вы хотите.Или ваш пользователь.

java.time и ThreeTenABP

Теперь, когда я пишу ответ, хочу упомянуть, что DateFormat и SimpleDateFormat общеизвестно хлопотны и давно устарели.Вместо этого рассмотрите возможность использования DateTimeFormatter и / или DateTimeFormatterBuilder из java.time, современного Java-API даты и времени.

    Locale usSpanish = Locale.forLanguageTag("es-US");
    String dateFormatPattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
            FormatStyle.SHORT, null, IsoChronology.INSTANCE, usSpanish);
    System.out.println("Format pattern: " + dateFormatPattern);

Шаблон формата: M / d / yy

Я запустил этот фрагмент на Java 7, используя ThreeTen Backport, бэкпорт java.time.И шаблон формата отличается от того, который я получил в Java 11 выше.Java 7 использует встроенные данные локали Java, в то время как Java 11 использует CLDR, Unicode Common Locale Data Repository.Есть различия между ними.Я не знаю, что использует Android, но я верю, что это что-то разумное.

Вопрос: Могу ли я использовать 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 с подпакетами.

Ссылки

0 голосов
/ 11 июня 2019

У меня была такая же проблема, я решил с этим (Есть kotlin, но вы можете легко преобразовать его в Java):

private val calendario: Calendar = Calendar.getInstance()
private val sdf: DateFormat = SimpleDateFormat.getDateInstance(DateFormat.SHORT)

fechaPagoBT.text = sdf.format(calendario.time)

Возвращает дд / мм / гггг или мм / дд / гггг в зависимости от региона устройства.

...