Java SimpleDataFormat的语言环境依赖性如何?

Java SimpleDataFormat的语言环境依赖性如何?,java,datetime,Java,Datetime,我经常使用类似于HH:mm:ss或yyyy-mm-dd的模式创建SimpleDataFormat,以独立于区域设置的方式输出日期。由于还有一个构造函数接受一个附加的locale参数,我想知道是否有这种格式依赖于locale的情况,或者是否应该始终指定locale.ENGLISH或locale.GERMANY。让我们假设时区是显式设置的。是的,完全区分区域设置。某些字段(如小时和分钟)与区域设置无关 SimpleDataFormat还支持本地化的日期和时间模式字符串。在这些字符串中,上述模式字母可

我经常使用类似于
HH:mm:ss
yyyy-mm-dd
的模式创建SimpleDataFormat,以独立于区域设置的方式输出日期。由于还有一个构造函数接受一个附加的locale参数,我想知道是否有这种格式依赖于locale的情况,或者是否应该始终指定locale.ENGLISH或locale.GERMANY。让我们假设时区是显式设置的。

是的,完全区分区域设置。某些字段(如小时和分钟)与区域设置无关

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

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

publicsimpledateformat(字符串模式、区域设置)

使用给定的模式和给定区域设置的默认日期格式符号构造一个
SimpleDataFormat
。注意:此构造函数可能不支持所有区域设置。要实现完全覆盖,请使用类中的工厂方法


刚刚在Locale上找到了
getAvailableCales
静态方法,结果表明日历的所有字段都可以依赖于Locale:

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 ๒๕๕๔-๐๓-๐๓ ๑๖:๕๓:๐๙
因此,使用不同的纪元,但以其他方式为基础,这解释了为什么月份和日期是相同的

其他地区也使用不同的文字书写数字,例如在印度使用的文字和在泰国使用的泰语变体

要回答这个问题,当需要与区域设置无关的字符串时,应该始终将区域设置指定为已知值

Edit:Java1.6添加了一个常量来指定语言/国家中立的语言环境。这比指定针对计算机的输出的英语区域设置更可取

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


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

String time=newsimpledateformat(“HH:mm:ss”).format(new Date())

控制台输出:

11:52:45

我问的是不包含任何月或日名称的模式,例如
yyyy-MM-dd
,我想要一个与区域设置无关的输出,可能通过省略区域设置参数来保存一些击键。@Jörn:ah!在这个特定的示例中,省略额外的参数应该没有问题。不过,时区格式可能是另一回事。尽管如此,让Java担心特定于语言环境的格式(例如,决定何时使用
mm/dd/yyyy
vs
dd/mm/yyyy
)可能会更好。我养成了总是指定语言环境的习惯(至少当应用程序不是始终使用系统语言环境的客户端应用程序时),以确保(或其他人)如果模式必须更改,请不要忘记指定一个。这有点像总是在块周围使用花括号的规则,即使它只有一行。@JB Nizet,很好的指导原则。这也会让我思考日期是用于显示还是供计算机使用。