SimpleDateFormat правильно работает на эмуляторе и неправильно на устройстве - PullRequest
0 голосов
/ 09 сентября 2011

Я использую SimpleDateFormat, чтобы получить соответствующую информацию из даты. В эмуляторе все работало нормально, но при тестировании на устройстве форматирование не удается. Logcat показывает это правильно в эмуляторе, но опять-таки неправильно для трубки.

    private String getSectionHeaderTitle(Date date) {
    SimpleDateFormat dayFormat = new SimpleDateFormat("E");
    SimpleDateFormat monthFormat = new SimpleDateFormat("MMM");
    SimpleDateFormat dayNumFormat = new SimpleDateFormat("dd");
    SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy");

    String dayString = dayFormat.format(date);
    String monthString = monthFormat.format(date);
    String dayNumString = dayNumFormat.format(date);
    String yearString = yearFormat.format(date);

    String headerTitle = dayString + ", " + monthString + " "
            + dayNumString + " " + yearString;

    Log.i(TAG, "Date " + date + " Day " + dayString + ", " + " Month "
            + monthString + " Year " + yearString);
    Log.d(TAG, headerTitle);
    return headerTitle;
}

Журнал для эмулятора 2.3.3:

09-09 13:13:55.435: INFO/EventsListActivity(4252): Date 2011-12-11 Day Sun,  Month Dec Year 2011
09-09 13:13:55.435: DEBUG/EventsListActivity(4252): Sun, Dec 11 2011

Журнал для устройства 2.3.4:

09-09 18:30:34.203: INFO/EventsListActivity(7962): Date 2011-10-16 Day 1,  Month 10 Year 2011
09-09 18:30:34.203: DEBUG/EventsListActivity(7962): 1, 10 16 2011

Любая помощь очень ценится.

1 Ответ

3 голосов
/ 09 сентября 2011

Символы (т. Е. 'Sun' против '1'), используемые SimpleDateFormat, устанавливаются с помощью элемента DateFormatSymbols SimpleDateFormat.

В указанном вами коде вы не устанавливаете языковой стандарт явным образом, в результатеиспользуется системный языковой стандарт по умолчанию, часть информации, хранящейся в этом языковом стандарте, является объектом DateFormatSymbols.

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

Это именно то, что происходит в приведенном выше коде, эмулятор имеет локаль по умолчанию, отличную от устройства, и, следовательно, другой набор DateFormatSymbols.Исходя из вашего вывода, я бы предположил, что по умолчанию для устройства используется локаль Locale.ROOT, которая просто печатает целочисленные значения без языка.

Самый простой способ исправить это - вручную установить локаль, используемую для объектов SimpleDateFormat.

Locale locale = Locale.US;  //or whatever you want, see note below

SimpleDateFormat dayFormat = new SimpleDateFormat("E", locale);
SimpleDateFormat monthFormat = new SimpleDateFormat("MMM", locale);
SimpleDateFormat dayNumFormat = new SimpleDateFormat("dd", locale);
SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy", locale);

См. http://developer.android.com/reference/java/util/Locale.html#default_locale для доступных локалей или вы можете просмотреть их через метод Locale.getAvailableLocales ().

...