Почему 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));