Почему java.text.DateFormat возвращает тот же формат даты для en_US и en_GB на Android?

У меня есть небольшое приложение для Android, которое я использую для печати определенной даты в разных форматах на основе языка.

Вот мой код (используя java.text.DateFormat):

Locale[] locales = {new Locale("en", "US"), new Locale("en", "GB"), new Locale("en", "AU"), new Locale("en", "NZ"), new Locale("en", "ZA")};
for(int i = 0; i < locales.length; ++i) {
    Log.d(logKey, locales[i].toString() + " - " + DateFormat.getDateInstance(DateFormat.SHORT, locales[i]).format(Calendar.getInstance().getTime()));
}

Таким образом, вывод из этого в LogCat:

D/FormatPoC(  390): en_US - 4/27/12
D/FormatPoC(  390): en_GB - 4/27/12
D/FormatPoC(  390): en_AU - 4/27/12
D/FormatPoC(  390): en_NZ - 4/27/12
D/FormatPoC(  390): en_ZA - 4/27/12

Итак, мой вопрос: почему все они одинаковы? В Java SE я получаю:

en_US - 4/27/12
en_GB - 27/04/12
en_AU - 27/04/12
en_NZ - 27/04/12
en_ZA - 2012/04/27

Это то, чего я ожидал бы. Я знаю, что я могу использовать android.text.format.DateFormat для получения правильных результатов на основе текущей настройки языка и даты, но это не объясняет, почему использование java.text.DateFormat для получения формата для программно заданного языкового стандарта не возвращает права результаты.

Кроме того, не только формат даты SHORT - MEDIUM и LONG показывают несоответствия между Android и Java SE (т.е. Android возвращает тот же формат для всех 5 локалей, которые я указал).

Я тестировал его на 3 разных устройствах (2.3 и 4.0) и на эмуляторе (2.3 и 4.0), все с одинаковыми результатами. Я также тестировал с помощью Locale.US и Locale.UK только для того, чтобы узнать, чем они отличаются друг от друга, но результаты одинаковы.

Кто-нибудь еще сталкивается с этим или знает, почему это было бы?

ОБНОВЛЕНИЕ: 2012-07-18

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

https://play.google.com/store/apps/details?id=org.jessies.dalvikexplorer&hl=en

Я смог увидеть, что система возвращает для en_GB на разных устройствах (включая эмулятор). Некоторые возвращают соответствующие форматы, некоторые возвращают формат en_US. Я предполагаю, что это просто проблема того, какие ресурсы формата встроены в ОС для каждого устройства, хотя, поскольку эмулятор возвращает неправильные форматы, а также многие из моих устройств, изготовленных в США, мне интересно, что думают британские разработчики, или если они Мы видели эту проблему.

Ответ 1

Это не ответ (у меня еще нет комментариев, чтобы добавить комментарий...)

Как британский разработчик, я столкнулся с этой проблемой. Я вижу эту проблему с моей Galaxy S3, как вы описали.

Мне нужно прибегнуть к тому, чтобы пользователь мог выбрать формат даты в качестве предпочтения. Не очень хорошо.

Программа DalvikExplorer также показывает проблему:

enter image description here

Ответ 2

попробуйте следующее:

    int style = DateFormat.MEDIUM;
    //Also try with style = DateFormat.FULL and DateFormat.SHORT
    Date date = new Date();
    DateFormat df;
    df = DateFormat.getDateInstance(style, Locale.UK);
    Log.d("Locale.UK","Locale.UK - "+df.format(date));
    System.out.println("United Kingdom: " + df.format(date));
    df = DateFormat.getDateInstance(style, Locale.US);
    Log.d("Locale.US","Locale.US - "+df.format(date));
    df = DateFormat.getDateInstance(style, Locale.FRANCE);
    Log.d("Locale.FRANCE","Locale.FRANCE - "+df.format(date));
    df = DateFormat.getDateInstance(style, Locale.ITALY);
    Log.d("Locale.ITALY","Locale.ITALY - "+df.format(date));
    df = DateFormat.getDateInstance(style, Locale.JAPAN);
    Log.d("Locale.JAPAN","Locale.JAPAN - "+df.format(date));