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

时间:2012-07-03 14:18:01

标签: java junit timezone environment

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

private String printStandardDate(Date date) {
    return DateFormat.getDateTimeInstance(
        DateFormat.SHORT, DateFormat.SHORT).format(date);
}

我发现这会产生不同的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]>

有人可以解释这种行为吗?

2 个答案:

答案 0 :(得分:18)

这并不奇怪,这正是它应该起作用的方式。

DateFormat.getDateTimeInstance的API文档说:

  

获取日期/时间格式化程序,其中包含默认语言环境的给定日期和时间格式样式

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

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

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

更好的方法是重用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);
}

答案 1 :(得分:9)

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

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

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