如何确定区域设置是否使用AM / PM?

时间:2013-11-29 10:31:32

标签: java localization jodatime

我有一个标签,只显示当天某小时的分钟部分。我想让它读取“PM”或“00”,具体取决于时区。

我目前的解决方案只使用Joda的DateTimeFormat.shortTime().withLocale(myLocale)并从结果中取出最后2个字符。这有效,但感觉不对。

相反,我想检查给定的语言环境是否使用AM / PM表示法,但我没有找到API调用来提供该信息。它是否存在,无论是在JodaTime还是Java库本身?例如,我想写一些类似usesAmPm(myLocale)) ? DateTimeFormat.forPattern("a") : DateTimeFormat.forPattern("mm")

的内容

3 个答案:

答案 0 :(得分:5)

回答如何检查给定语言环境是否使用AM / PM表示法的问题:

关于此类本地化数据的唯一常见来源是来自Unicode联盟的CLDR。间接地,JDK加载一小部分CLDR,可以按如下方式访问:

public static boolean usesAmPm(Locale locale) {
  DateFormat df = DateFormat.getTimeInstance(DateFormat.FULL, locale);
  if (df instanceof SimpleDateFormat) {
    return ((SimpleDateFormat) df).toPattern().contains("a");
  } else {
    return false; // unlikely to happen
  }
}

答案 1 :(得分:5)

这与Meno的答案非常相似,但我不喜欢instanceof用法(某种形式的强迫症,我猜)。这是我的版本:

public static boolean usesAmPm(Locale locale)
{
    String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
        FormatStyle.MEDIUM, FormatStyle.MEDIUM, IsoChronology.INSTANCE, locale);
    return pattern.contains("a");
}

答案 2 :(得分:1)

Meno解决方案的缩写变体:

public static boolean usesAmPm(Locale locale) {
        DateFormat df = DateFormat.getTimeInstance(DateFormat.FULL, locale);
        return df instanceof SimpleDateFormat && ((SimpleDateFormat) df).toPattern().contains("a");
}