SimpleDateFormat在仿真器上工作正常,但在设备上错误 [英] SimpleDateFormat works correctly on emulator and is wrong on the device

查看:0
本文介绍了SimpleDateFormat在仿真器上工作正常,但在设备上错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用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

非常感谢您的帮助。

推荐答案

符号(即SimpleDateFormat使用的"Sun"vs"1")是通过SimpleDateFormat的DateFormatSymbols成员设置的。

在您提供的代码中,您没有显式设置区域设置,因此使用了系统的默认区域设置,该区域设置中存储的部分信息是DateFormatSymbols对象。

通常,相信默认区域设置是正确的从来都不是一个好主意,它可能会因系统和其他因素而异。

这正是在上面的代码中发生的事情,模拟器具有与设备不同的默认区域设置,因此有一组不同的DateFormatSymbol。根据您的输出,我猜设备默认使用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()方法查看它们。

这篇关于SimpleDateFormat在仿真器上工作正常,但在设备上错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆