我有一个标签,只显示当天某小时的分钟部分。我想让它读取“PM”或“00”,具体取决于时区。
我目前的解决方案只使用Joda的DateTimeFormat.shortTime().withLocale(myLocale)
并从结果中取出最后2个字符。这有效,但感觉不对。
相反,我想检查给定的语言环境是否使用AM / PM表示法,但我没有找到API调用来提供该信息。它是否存在,无论是在JodaTime还是Java库本身?例如,我想写一些类似usesAmPm(myLocale)) ? DateTimeFormat.forPattern("a") : DateTimeFormat.forPattern("mm")
答案 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");
}