有没有办法指定 dateFormat 元素并遵守当前的语言环境规则?我知道我可以使用 SimpleDateFormat
并指定我喜欢的格式 - 但在不同的国家可能是错误的。
我试图屏蔽 DateFormat
中的元素,但它只接受 SHORT、MEDIUM 和 LONG:
DateFormat dayMonth = DateFormat.getDateInstance(DateFormat.DAY_OF_WEEK_IN_MONTH_FIELD | DateFormat.MONTH_FIELD);
Caused by: java.lang.IllegalArgumentException: Illegal date style: 11
at java.text.DateFormat.checkDateStyle(DateFormat.java:843)
at java.text.DateFormat.getDateInstance(DateFormat.java:378)
我想获取“2016 年 10 月”或“2016 年 Říj”。这可以通过以下方式实现:
DateFormat dayMonth = new SimpleDateFormat("MMM yyyy");
但我不想在我的应用中硬编码这种格式。我只看到一种方法:将它放入 strings.xml 中,翻译人员将不得不对其进行设置。或者有更好的方法吗?
最佳答案
Android 有 DateFormat.getBestDateTimePattern()
实现这一目标
pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), "MMMyyyy");
dayMonth = new SimpleDateFormat(pattern);
唯一的缺点是 API 级别为 18。我个人使用 DateFormat.getMediumDateFormat()
的结果作为后备。或者,您可以忽略旧设备的语言环境并使用 new SimpleDateFormat("MMM yyyy")
作为后备或尝试向后移植这一方法。
OP 编辑
我在 Nexus 5x 和 Android 6 上尝试了以下代码
for (Locale locale : locales) {
format = android.text.format.DateFormat.getBestDateTimePattern(locale, "MMMyyyy");
DateFormat dateFormat = new SimpleDateFormat(format, locale);
log.debug("{}: {}", locale.getCountry(), dateFormat.format(new Date()));
}
下面是一些结果:
- 北美:2016 年 7 月
- AE: يوليو٢٠١٦
- BG:07.2016 年。
- 捷克:2016 年 cervenec
- 法国:古埃 2016
- DE:2016 年 7 月
- 英国:2016 年 7 月
- FI:heinä 2016
- IT:吕 2016
- 人力资源:2016 年 SRP。
- 俄罗斯:2016 年 июль
关于android - 尊重当前语言环境的自定义 Android 日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38545812/