构建支持不同Locales的Java应用程序,但希望自定义DateFormat显示超出FULL,LONG,MEDIUM和SHORT DateFormat选项之间的可用范围。想要做一些事情,比如在DateFormat.getDateTimeFormat()的日期和时间组件之间放置一个字符,小写AM / PM等,至少为英语。
可以想到3种方法:
1)如果locale是english,请在新的SimpleDateFormat对象上使用我的自定义格式字符串。
2)修改现有语言环境的默认格式字符串
3)创建一个新的语言环境变体,指定我想要的格式字符串
无法弄清楚如何做2或3(或者如果它甚至可能),并且宁愿不做1 ...有没有人之前处理过这样的事情?
另外,似乎需要2或3来降低AM / PM? (为语言环境的dateformat设置指定AmPmMarkers资源)
答案 0 :(得分:1)
为什么不使用MessageFormat?
使用模式“{0,date,short}您的文字{0,time,short}”来做你想做的事。
答案 1 :(得分:1)
Java只有一个类,它是ResourceBundle类。 Back它带有属性文件,您拥有所需的一切以及更多。
即使没有ResourceBundle类,您也可以使用properties文件来保存所有SimpleDateFormat格式。
Settings formats = new Settings();
Properties SDFFormats = formats.load(propertiesFile);
String SDFAmerica = SDFFormats.getProperty("FormatAmerica");
虽然可以读取属性文件中的内容
FormatAmerica = MMM-dd-yyyy
答案 2 :(得分:0)
我所处理的唯一类似事实是“strftime”和“locale”说意大利语应该在时间字段之间使用冒号,但Java会在它们之间设置完全停止。所以我添加了以下代码:
// This is an incredibly ugly hack, but it's based on the fact that
// Java for some reason decided that Italy uses "." between
// hours.minutes.seconds, even though "locale" and strftime say
// something different.
hmsTimeFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM);
if (hmsTimeFormat instanceof SimpleDateFormat)
{
String str = ((SimpleDateFormat)hmsTimeFormat).toPattern();
str = str.replace('.', ':');
hmsTimeFormat = new SimpleDateFormat(str);
}
答案 3 :(得分:0)
我们已经想到的最令人满意的解决方法是从特定于语言环境的资源包加载Strings am,pm,formatString,然后:
SimpleDateFormat sdf = (SimpleDateFormat)sdf.getDateTimeInstance(DateTime.SHORT,DateTime.SHORT, locale);
if (formatString != null) {
sdf = new SimpleDateFormat(formatString);
}
if (am!= null && pm != null) {
DateFormatSymbols symbols = sdf.getDateFormatSymbols();
symbols.setAmPmStrings(new String[]{am, pm});
sdf.setDateFormatSymbols(symbols);
}
Paul:不确定DateFormatSymbols中是否有分隔符,但是......所以你可能需要保留str.replace
答案 4 :(得分:0)
我建议您使用Joda Time进行日期格式设置。它的格式化具有强大而优雅的灵活性。您可能会发现它的格式化程序使您想要做的事情非常简单。
顺便说一句:一旦你去了乔大,你就永远不会回去了!