语言环境依赖如何是SimpleDateFormat?

时间:2011-03-02 23:09:18

标签: java datetime

我经常使用HH:mm:ssyyyy-MM-dd这样的模式创建SimpleDateFormat,以独立的方式输出日期。由于还有一个构造函数采用了额外的语言环境参数,我想知道是否存在这样的格式可能依赖于语言环境的情况,或者我是否应该始终指定Locale.ENGLISH或Locale.GERMANY。让我们假设时区是明确设置的。

3 个答案:

答案 0 :(得分:15)

在Locale上找到了getAvailableLocales静态方法,结果发现日历的所有字段都可以依赖于语言环境:

public static void main(String[] args) {
    String pattern = "yyyy-MM-dd HH:mm:ss";
    Date date = new Date();
    String defaultFmt = new SimpleDateFormat(pattern).format(date);

    for (Locale locale : Locale.getAvailableLocales()) {
        String localeFmt = new SimpleDateFormat(pattern, locale).format(date);
        if (!localeFmt.equals(defaultFmt)) {
            System.out.println(locale + " " + localeFmt);
        }
    }
}

在我的系统上(在德国运行英文版的ubuntu),输出以下列表,希望unicode字符完好无损:

ja_JP_JP 23-03-03 16:53:09
hi_IN २०११-०३-०३ १६:५३:०९
th_TH 2554-03-03 16:53:09
th_TH_TH ๒๕๕๔-๐๓-๐๓ ๑๖:๕๓:๐๙

所以JapanThailand使用不同的纪元,但是基于gregorian calendar,这解释了为什么月份和日期是相同的。

其他语言环境也使用不同的脚本来编写数字,例如印度使用的Hindi和泰国的泰语版本。

要回答这个问题,当需要区域设置独立的String时,应始终将语言环境指定为已知值。

编辑:Java 1.6添加了一个常量Locale.ROOT来指定语言/国家/地区中性语言环境。这将优先指定针对计算机的输出的英语区域设置。

  

根区域设置是其语言,国家/地区和变体为空(“”)字符串的区域设置。这被视为所有语言环境的基本语言环境,并用作语言环境敏感操作的语言/国家/地区中性语言环境。

答案 1 :(得分:4)

是的,SimpleDateFormat绝对是区分设置敏感的。某些字段(如小时和分钟)与区域设置无关。

  

SimpleDateFormat还支持本地化的日期和时间模式字符串。在这些字符串中,上述模式字母可以用其他依赖于语言环境的模式字母替换。 SimpleDateFormat不处理模式字母以外的文本本地化;这取决于班级的客户。

或者,您可以使用本地化友好的DateFormat#getDateInstance()工厂方法,因为:

  

public SimpleDateFormat(String pattern, Locale locale)

     

使用给定模式和给定语言环境的默认日期格式符号构造SimpleDateFormat。注意:此构造函数可能不支持所有语言环境。要获得完整的覆盖率,请使用DateFormat类中的工厂方法。

答案 2 :(得分:-1)

这对我有用,也许你应该尝试一下:

String time = new SimpleDateFormat("HH:mm:ss").format(new Date());

控制台输出:

11:52:45