【问题标题】:Is there another way to retrieve default pattern for a given locale?是否有另一种方法可以检索给定语言环境的默认模式?
【发布时间】:2011-03-30 03:42:13
【问题描述】:

是否可以在不将DateFormat.get*Instance() 返回的对象转换为SimpleDateFormat 的情况下检索给定语言环境的默认模式?

我明白,在大多数情况下一切都会好起来的,但在javadochere 中有一条注释:“如果您想要更多地控制格式或解析,(或者想要给您的用户更多控制),您可以尝试将您从工厂方法获得的DateFormat 转换为SimpleDateFormat。这适用于大多数国家/地区;请记住将其放在try 块中以防万一一个不寻常的。”

所以我想知道,万一我“遇到不寻常的人”该怎么办?

Related theme.

代码示例:

/**
 * Returns '\n'-separated string with available patterns.
 * Optional adds appropriate language code to each pattern string.
 * 
 * @param showLanguage Defines if language info is required.
 * @return  String with available patterns, optional (if showLanguage is set
 * to "true") adds appropriate language code to each pattern.
 */
public String getPatternsForAvailableLocales(Boolean... showLanguage) {

    /* Array of available locales */
    Locale[] locales = DateFormat.getAvailableLocales();

    String result = "";

    for (Locale locale : locales) {

        /* Add language info, if necessary */
        if ((showLanguage.length > 0) && (showLanguage[0])) {
            result += locale.getLanguage() + '\t';
        }

        /* Retrieving pattern */ 
        try {
            result += ((SimpleDateFormat)
                    DateFormat.getDateTimeInstance(DateFormat.SHORT,
                            DateFormat.SHORT, locale)).toPattern();
        } catch (ClassCastException e) {
            // ******************************** //
            // What's up? Is there another way? //
            // ******************************** //
        }

        result += '\n';

    }
    return result;
}

【问题讨论】:

  • 如果您“遇到不寻常的人”,我不确定您是否可以做任何事情,因为它可能不是基于模式的。特别是因为开发人员可以通过java.text.spi.DateFormatProvider 提供自己的DateFormat

标签: java locale simpledateformat


【解决方案1】:

模式本身是 SimpleDateFormat 所独有的,这就是您要转换它的原因。

如果您发现 DateFormat 不是 SimpleDateFormat,您希望记录异常,记录实际实现的类,此时您将有足够的信息来决定如何处理这种情况。

目前,由于没有模式,如果不是 SimpleDateFormat,请不要将其添加到结果列表中。

如果我可以问,你为什么返回一个连接的字符串而不是一个字符串集合?循环遍历结果似乎会更容易。

如果连接的 String 是必不可少的,请使用 StringBuilder 来构建它,因为您将创建更少的对象并提高性能。在循环中构建字符串是一个好习惯。

【讨论】:

  • 感谢您的回答。尽管您没有针对具体问题提供直接答案,但您提出了处理这种可能情况的和谐解决方案(实践表明,这种情况不太可能发生,但可能发生)。所以我认为你的回答可以被接受为解决方案。
  • 为您的 cmets 提供更多代码。回答您的问题:
  • 1) 是的,我同意使用字符串集合会更方便,但这只是说明问题的代码。
  • 2) 当然在这种情况下应该优先使用 StringBuilder 而不是 String
【解决方案2】:

您可以通过执行以下 Java 代码来检索特定语言的日期格式符号:

System.out.println(DateFormatSymbols.getInstance
        (new Locale("en_US")).getLocalPatternChars());
System.out.println(DateFormatSymbols.getInstance
        (new Locale("nl_NL")).getLocalPatternChars());

在这种特殊情况下,荷兰语的日期格式符号是相同的。

GyMdkHmsSEDFwWahKzZ
GyMdkHmsSEDFwWahKzZ

如果外语符号不同,则用外语字符替换简单格式字符串中的英文字符。

DateFormatSymbols 类至少从 Java 1.4.2 开始就存在。

【讨论】:

    猜你喜欢
    • 2013-02-09
    • 2014-03-31
    • 2014-03-31
    • 2018-09-10
    • 2018-08-12
    • 2019-12-07
    • 2011-10-29
    • 2016-09-07
    相关资源
    最近更新 更多