使用DateFormat.getDateTimeInstance().format(date);

Mic*_*l W 11 java environment timezone junit

在运行一些测试时,我遇到了以下问题.使用时:

private String printStandardDate(Date date) {
    return DateFormat.getDateTimeInstance(
        DateFormat.SHORT, DateFormat.SHORT).format(date);
}
Run Code Online (Sandbox Code Playgroud)

我发现这会产生不同的Date格式,具体取决于运行测试的位置.所以在windows/eclipse本地我得到了一个结果:04/02/12 18:18但是在美国的Linux机器上我得到了2/4/12 6:18 PM

这会导致我的测试/构建失败:

预期:<[04/02/12 18:18]>但是:<[2/4/12 6:18 PM]>

有谁能解释这种行为?

Jes*_*per 18

这并不奇怪,这正是它应该如何工作的.

API文档DateFormat.getDateTimeInstance说:

获取具有默认语言环境的给定日期和时间格式样式的日期/时间格式化程序.

Windows系统上的默认语言环境与美国的Linux机箱不同.

如果您想要精确控制日期和时间格式,请自行使用SimpleDateFormat并指定格式.例如:

private String printStandardDate(Date date) {
    return new SimpleDateFormat("dd/MM/yy HH:mm").format(date);
}
Run Code Online (Sandbox Code Playgroud)

更好的方法是重用SimpleDateFormat对象,但要注意它不是线程安全的(如果同时从多个线程调用该方法,如果这些线程使用相同的SimpleDateFormat对象,事情就会搞砸).

private static final DateFormat DATE_FORMAT =
    new SimpleDateFormat("dd/MM/yy HH:mm");

private String printStandardDate(Date date) {
    return DATE_FORMAT.format(date);
}
Run Code Online (Sandbox Code Playgroud)


Edw*_*rzo 9

格式基于代码中的默认语言环境.如果要确保结果,必须确保使用特定的区域设置.getDateTimeInstance重载该方法以提供另一种方法,该方法接收您要用作参数的语言环境.

public static final DateFormat getDateTimeInstance(int dateStyle,
                             int timeStyle,
                             Locale aLocale)
Run Code Online (Sandbox Code Playgroud)

如果在两个测试环境中使用相同的区域设置,结果应该相同.