Java 使用DateFormat.getDateTimeInstance().format(日期);

Java 使用DateFormat.getDateTimeInstance().format(日期);,java,junit,timezone,environment,Java,Junit,Timezone,Environment,在运行一些测试时,我遇到了以下问题。使用时: private String printStandardDate(Date date) { return DateFormat.getDateTimeInstance( DateFormat.SHORT, DateFormat.SHORT).format(date); } 我发现这会根据测试运行的位置产生不同的日期格式。所以在windows/eclipse中,我得到了一个结果:04/02/12 18:18,但在美国的Linu

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

private String printStandardDate(Date date) {
    return DateFormat.getDateTimeInstance(
        DateFormat.SHORT, DateFormat.SHORT).format(date);
}
我发现这会根据测试运行的位置产生不同的日期格式。所以在windows/eclipse中,我得到了一个结果:04/02/12 18:18,但在美国的Linux机器上,我得到了下午2/4/12 6:18

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

预期:但是:


有人能解释这种行为吗?

这并不奇怪,这正是它的工作原理

DateFormat.getDateTimeInstance
的API文档说明:

获取具有默认区域设置的给定日期和时间格式样式的日期/时间格式设置程序。

Windows系统上的默认区域设置与美国Linux系统上的不同

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

private String printStandardDate(Date date) {
    return new SimpleDateFormat("dd/MM/yy HH:mm").format(date);
}
更好的做法是重新使用
SimpleDateFormat
对象,但要注意它不是线程安全的(如果可能同时从多个线程调用该方法,那么如果这些线程使用相同的
SimpleDateFormat
对象,事情就会变得一团糟)


格式基于代码中的默认区域设置。如果要确保结果,必须确保使用特定的区域设置。
getDateTimeInstance
方法被重载,以提供接收要用作参数的区域设置的方法

public static final DateFormat getDateTimeInstance(int dateStyle,
                             int timeStyle,
                             Locale aLocale)

如果您在两个测试环境中使用相同的语言环境,结果应该是相同的。

您没有给出每个服务器上的时区对不起,我在GMT时区,Linux box是ESTEdwin Dalorzo给您一个很好的例子为什么不给他投票呢?我已经:)感谢我们,有时候我太专注于主题解决方案了,以至于忘记了论坛习惯。事实上,它们不应该,因为
TimeZone.getDefault()
也扮演着一个角色,所以这也需要设置。这是一个很好的答案。@ShouhengWang不,类
SimpleDateFormat
不是线程安全的。我上面的答案是2012年的——现在最好使用Java8中添加的新Java日期和时间API。包
java.time.format
中的格式化程序是线程安全的。
public static final DateFormat getDateTimeInstance(int dateStyle,
                             int timeStyle,
                             Locale aLocale)