尊重当前语言环境的自定义 Android 日期格式

Leo*_*rak 4 android localization

有没有办法指定 dateFormat 元素并遵守当前的语言环境规则?我知道我可以使用SimpleDateFormat和指定我喜欢的格式 - 但在不同的国家可能是错误的。

我试图掩盖其中的元素,DateFormat但它只接受短、中和长:

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)
Run Code Online (Sandbox Code Playgroud)

我想得到“Oct 2016”或“?íj 2016”。这可以通过以下方式实现:

DateFormat dayMonth = new SimpleDateFormat("MMM yyyy");
Run Code Online (Sandbox Code Playgroud)

但我不想在我的应用程序中硬编码这种格式。我只看到一种方法:将它放入 strings.xml 中,翻译人员必须对其进行设置。或者有更好的方法吗?

tyn*_*ynn 6

Android必须DateFormat.getBestDateTimePattern()实现这一点

pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), "MMMyyyy");
dayMonth = new SimpleDateFormat(pattern);
Run Code Online (Sandbox Code Playgroud)

唯一的缺点是 API 级别为 18。我个人使用了DateFormat.getMediumDateFormat()作为回退的结果。或者,您可以忽略旧设备的语言环境并将其new SimpleDateFormat("MMM yyyy")用作后备或尝试向后移植这种方法。

操作编辑

我在 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()));
}
Run Code Online (Sandbox Code Playgroud)

这是一些结果:

  • 不适用:2016 年 7 月
  • 艾:??????
  • BG: 07.2016 ?.
  • CZ: ervenec 2016
  • FR: Goue 2016
  • DE: 2016 年 7 月
  • GB:2016 年 7 月
  • FI:海奈 2016
  • IT:吕 2016
  • 人力资源:srp 2016。
  • 茹:???2016年