我使用SimpleDateFormat从Date中提取相关信息。它在模拟器中运行得很好,但在设备上进行测试时,无法正确格式化。 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
非常感谢任何帮助。
答案 0 :(得分:3)
SimpleDateFormat使用的符号(即'Sun'与'1')是通过SimpleDateFormat的DateFormatSymbols成员设置的。
在您提供的代码中,未明确设置区域设置,因此使用系统的默认区域设置,存储在该区域设置中的部分信息是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()方法查看它们。