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

2022-09-04 06:45:27

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

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]>

谁能解释这种行为?


答案 1

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

的 API 文档说:DateFormat.getDateTimeInstance

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

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

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

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

更好的做法是重用该对象,但要注意它不是线程安全的(如果该方法可能同时从多个线程调用,则如果这些线程使用相同的对象,事情就会变得混乱)。SimpleDateFormatSimpleDateFormat

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

private String printStandardDate(Date date) {
    return DATE_FORMAT.format(date);
}

答案 2

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

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

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


推荐