我有这样的SimpleDateFormat。
SimpleDateFormat dateFormat=new SimpleDateFormat("dd MMMM", new Locale("tr"));
txtDateText.setText(dateFormat.format(selectedDate).toUpperCase(new Locale("tr")));
当我在Android 3.0
,3.1
,3.2
,4.0
和其他最新版本上试用时,我会得到这个结果。
02 KASIM
但是在尝试使用Android 2.2
,2.3
和其他人时,请获得此结果。
02 11
我该如何解决?
答案 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)
旧设备似乎没有安装土耳其语语言环境。