SimpleDateFormat在Android 2.3及更早版本上无法正常运行

时间:2013-10-31 15:13:21

标签: java android simpledateformat

我有这样的SimpleDateFormat。

SimpleDateFormat dateFormat=new SimpleDateFormat("dd MMMM", new Locale("tr"));
txtDateText.setText(dateFormat.format(selectedDate).toUpperCase(new Locale("tr")));

当我在Android 3.03.13.24.0和其他最新版本上试用时,我会得到这个结果。

02 KASIM

但是在尝试使用Android 2.22.3和其他人时,请获得此结果。

02 11

我该如何解决?

3 个答案:

答案 0 :(得分:4)

我曾经遇到过同样的问题。您可以检查土耳其语区域是否存在。

BTW最好从strings.xml获取月份名称。将来为您的应用程序添加多语言支持会更容易。只需使用日期对象中的默认语言环境获取月份编号,并从月份数组中获取其引用。

编辑:我想知道api级别之间存在这种差异的原因并下载了api级别10和14的源代码,然后开始调试。

原因:很快,差异来自java.text.DateFormatSymbols级。两个api都有相同的代码,但它们使用libcore.icu.LocaleData的不同版本(或具有不同的行为)。哪个负责初始化DateFormatSymbols instace。

<强>详情: 如果使用语言环境创建SimpleDateFormat实例,则此参数用于实例化其名为formatData的属性(DateFormatSymbols的实例)。

它的构造函数:

来自API级别10和14 java.text.DateFormatSymbols

public DateFormatSymbols(Locale locale) {
    this.locale = locale;
    this.localPatternChars = SimpleDateFormat.PATTERN_CHARS;
    LocaleData localeData = LocaleData.get(locale);
    this.ampms = localeData.amPm;
    this.eras = localeData.eras;
    this.months = localeData.longMonthNames;
    this.shortMonths = localeData.shortMonthNames;
    this.weekdays = localeData.longWeekdayNames;
    this.shortWeekdays = localeData.shortWeekdayNames;

    // ICU/Android extensions.
    this.longStandAloneMonths = localeData.longStandAloneMonthNames;
    this.shortStandAloneMonths = localeData.shortStandAloneMonthNames;
    this.longStandAloneWeekdays = localeData.longStandAloneWeekdayNames;
    this.shortStandAloneWeekdays = localeData.shortStandAloneWeekdayNames;
}

我无法在libcore.icu.LocaleData上调试,但差异来自该类。对于api级别10和14,值从LocalData实例加载不同。Change log can be investigated to find the differences on LocaleData

<强>总: 如果在Api等级10之前使用未定义的区域设置(例如“xx”)创建SimpleDateFormat,则系统使用数字表示(对于月份名称[1..12],日期名称[1..6])默认语言环境的输出。 在API级别14之后,如果未找到区域设置,则会根据默认区域设置显示输出。 (我还没有测试api级别11,12,13。)

我建议你使用系统的默认语言环境。如果必须使用任何区域设置,请首先检查是否已定义。如果没有定义,请编写自己的逻辑。

如果您想要显示日期,请在此答案中考虑我的第2行。

答案 1 :(得分:1)

可能是那些设备上没有“tr”区域设置吗?

我认为您可以查看:

for (Locale locale : Locale.getAvailableLocales()) {
    System.out.println(locale.toString());
}

答案 2 :(得分:0)

旧设备似乎没有安装土耳其语语言环境。