使用DateFormat.getDateTimeInstance().format(date)方法。

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

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


您没有在每个服务器上提供时区信息。 - cl-r
抱歉,我处于GMT时区,而Linux系统则在EST时区。 - Michael W
Edwin Dalorzo 给你一个很好的例子。 - cl-r
为什么不给他投票呢?我已经投了 :) - Michael W
谢谢您,有时我会太专注于解决问题,而忘记了论坛的习惯。 - cl-r
2个回答

20

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

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);
}

@ShouhengWang 不,SimpleDateFormat 类不是线程安全的。我上面的回答是从2012年开始的 - 现在最好使用Java 8中添加的新Java日期和时间API。包中的格式化程序 java.time.format 是线程安全的。 - Jesper

11
格式是基于您代码中的默认语言环境。如果您想确保结果,请确保使用特定的语言环境。 `getDateTimeInstance` 方法被重载以提供一个替代方法,可以接收您想要使用的语言环境作为参数。
public static final DateFormat getDateTimeInstance(int dateStyle,
                             int timeStyle,
                             Locale aLocale)

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


1
实际上,它们不应该这样做,因为TimeZone.getDefault()也起着作用,因此也需要设置。尽管如此,这仍然是一个很好的答案。 - eis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接