13

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

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 PM

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

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

谁能解释这种行为?

4

2 回答 2

20

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

API 文档DateFormat.getDateTimeInstance说:

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

您的 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);
}
于 2012-07-03T14:21:16.273 回答
11

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

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

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

于 2012-07-03T14:21:37.913 回答