5

构建一个支持不同区域设置的 Java 应用程序,但希望自定义DateFormat显示超出 、 、 和 DateFormat 选项之间FULL可用LONGMEDIUM内容SHORT。想做一些事情,比如在 a 的日期和时间组件之间放置一个字符DateFormat.getDateTimeFormat(),小写 AM/PM 等,至少对于英语。

可以想到3种方法来做到这一点:

new SimpleDateFormat1)如果语言环境是英语,请在对象上使用我的自定义格式字符串。

2) 修改现有语言环境的默认格式字符串

3)创建一个新的语言环境变体,指定我想要的格式字符串

无法弄清楚如何做 2 或 3(或者如果它甚至可能),并且宁愿不做 1 ......以前有没有人处理过这样的事情?

另外,小写 AM/PM 似乎需要 2 或 3 ?(为区域设置的日期格式设置指定 AmPmMarkers 资源)

4

5 回答 5

1

Java 有一个专门用于此的类,它是ResourceBundle类。使用属性文件支持它,您将拥有所需的一切以及更多。

即使没有 ResourceBundle 类,您也可以使用属性文件来保存所有 SimpleDateFormat 格式。

Settings formats = new Settings();
Properties SDFFormats = formats.load(propertiesFile);

String SDFAmerica = SDFFormats.getProperty("FormatAmerica");

虽然属性文件中的条目可能会读取

FormatAmerica = MMM-dd-yyyy
于 2008-10-23T17:32:06.717 回答
1

为什么不改用 MessageFormat 呢?

使用模式“{0,date,short} your text here {0,time,short}”来做你想做的事。

于 2008-10-21T23:53:45.463 回答
0

我们想出的最令人满意的解决方法是从特定于语言环境的资源包中加载字符串 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);
}

保罗:不确定 DateFormatSymbols 中是否有分隔符......所以你可能需要保留 str.replace

于 2008-10-22T15:55:13.603 回答
0

我建议您使用Joda Time进行日期格式设置。它的格式具有强大而优雅的灵活性。您可能会发现它的格式化程序使您想做的事情变得非常简单。

顺便说一句:一旦你去了 Joda,你就再也回不去了!

于 2008-10-23T09:19:37.257 回答
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);
      }
于 2008-10-21T20:19:36.567 回答