1

我有一个这样的 SimpleDateFormat。

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

当我在Android 3.03.1、和其他最新版本上尝试时,我得到了这个结果3.24.0

02 KASIM

但是当试穿时Android 2.22.3和其他人..,得到这个结果。

02 11

我该如何解决?

4

3 回答 3

4

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

顺便说一句,最好从strings.xml. 将来为您的应用程序添加多语言支持会更容易。只需从日期对象中获取具有默认语言环境的月份编号,并从您的月份数组中获取它的引用。

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

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

详细信息: 如果SimpleDateFormat实例是使用语言环境创建的,则此参数用于实例化其名为的属性formatData(它是 的实例DateFormatSymbols)。

它的构造函数:

从 API 级别 10 和 14java.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但差异来自那个类。LocalData对于 api 级别 10 和 14,值的加载方式与实例不同。可以调查更改日志以查找 LocaleData 上的差异

Sum: 如果SimpleDateFormat在 Api Level 10 之前使用未定义的语言环境(例如“xx”)创建 a,则系统使用默认语言环境输出的数字表示(对于月份名称 [1..12]、日期名称 [1..6]) . 在 API 级别 14 之后,如果未找到语言环境,则基于默认语言环境显示输出。(我还没有在 api 级别 11、12、13 上测试过。)

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

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

于 2013-10-31T15:34:51.010 回答
1

难道这些设备上没有“tr”语言环境吗?

我认为您可以通过以下方式进行检查:

for (Locale locale : Locale.getAvailableLocales()) {
    System.out.println(locale.toString());
}
于 2013-10-31T15:22:53.443 回答
0

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

于 2013-10-31T15:23:02.813 回答