尊重当前Locale的自定义Android日期格式

时间:2016-07-23 19:45:27

标签: android localization

有没有办法如何指定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年”。这可以通过以下方式实现:

DateFormat dayMonth = new SimpleDateFormat("MMM yyyy");

但我不想在我的应用中硬编码这种格式。我只看到一种方法:把它放到strings.xml中,翻译器必须设置它。或者有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

Android有DateFormat.getBestDateTimePattern()来实现此目标

pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), "MMMyyyy");
dayMonth = new SimpleDateFormat(pattern);

唯一的缺点是API级别为18.我个人使用DateFormat.getMediumDateFormat()的结果作为后备。或者,您可以忽略旧设备的区域设置,并使用new SimpleDateFormat("MMM yyyy")作为后备或尝试向后移植此方法。

OP编辑

我尝试使用Android 6的Nexus 5x以下代码

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()));
}

以下是一些结果:

  • NA:2016年7月
  • AE:2016年يوليو
  • BG:07.2016г。
  • CZ:červenec2016
  • FR:Goue 2016
  • DE:Juli 2016
  • GB:2016年7月
  • FI:heinä2016
  • IT:Lui 2016
  • HR:srp 2016。
  • RU:июль2016