【问题标题】:Customizing java.text formatters for different Locales为不同的语言环境定制 java.text 格式化程序
【发布时间】:2010-09-18 09:49:25
【问题描述】:

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

可以想出 3 种方法:

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

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

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

不知道怎么做 2 或 3(或者如果可能的话),宁愿不做 1... 以前有没有人处理过这样的事情?

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

【问题讨论】:

    标签: java localization internationalization locale


    【解决方案1】:

    为什么不改用 MessageFormat?

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

    【讨论】:

    • 因为有时它应该是“{0,time,short} your text here {0,date,short}”,具体取决于区域设置。
    【解决方案2】:

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

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

    Settings formats = new Settings();
    Properties SDFFormats = formats.load(propertiesFile);
    
    String SDFAmerica = SDFFormats.getProperty("FormatAmerica");
    

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

    FormatAmerica = MMM-dd-yyyy
    

    【讨论】:

      【解决方案3】:

      我处理过的唯一类似的事情是“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);
            }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-06-08
            • 2016-03-29
            • 1970-01-01
            • 2015-05-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多