【问题标题】:Using DateFormat.getDateTimeInstance().format(date);使用 DateFormat.getDateTimeInstance().format(date);
【发布时间】:2012-07-03 14:18:01
【问题描述】:

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

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

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

预计: 但实际是:

谁能解释这种行为?

【问题讨论】:

  • 您没有在每台服务器上提供 TimeZone
  • 对不起,我在 GMT 时区,Linux 机器是 EST
  • Edwin Dalorzo 给你一个很好的例子
  • 那你为什么不给他一票呢?我已经:)
  • 感谢我们,有时我太专注于主题解决方案,以至于忘记了论坛习惯。

标签: java junit timezone environment


【解决方案1】:

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

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 中的格式化程序是线程安全的。
【解决方案2】:

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

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

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

【讨论】:

  • 实际上不应该,因为TimeZone.getDefault() 也起作用,所以也需要设置。尽管如此,这是一个很好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 2022-12-27
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多