3

所以,我有一个 XML 文件,我使用 dbUnit 作为数据源,其中有一些日期。文件中的日期是这样的:“2010-02-04”,但是一旦它被加载并且我访问它以在测试中打印或比较,它认为日期是“2010-02-03 23:00”。

我猜这与 EDT/EST 有关,但我不确定如何强制 dbUnit(或可能休眠?)使用正确的时区。

有人对 dbUnit 和日期有任何经验吗?

谢谢,彼得

编辑
好吧,我很确定,出于某种原因,它会将日期读取为 EDT,这是正确的,然后将其存储为 EST,这在技术上是不正确的(我们在这里是 EDT),但在我的计算机上是正确的说是EST。这种转换导致日期“丢失”一个小时。不知道为什么 Java 认为我们是 EST(Windows XP 知道我们不是),并且不确定为什么 dbUnit 认为日期应该是 EDT,因为它和 Java 一样,可能应该将不正确的时区读取为 EST。这很令人困惑。

编辑 我把 Hibernate XML 拿出来,因为那不是问题。经过更多的探索,这里发生了什么事: 1. dbUnit 从源 XML 读取日期作为字符串并将其转换为 java.sql.Date。从本质上讲,这些不存储小时/分钟/秒,但是当您查看毫秒时,它显然被调整了 4 小时,以表明虽然在 EDT 是午夜,但在 UTC 是凌晨 4 点。此外,这由日历支持,该日历的时区标记为“美国/纽约”或其他类似名称。我记不清了。2. 每当我打印这个日期时,我的系统,它认为它是美国东部标准时间,它会将世界标准时间凌晨 4 点重新转换为前一天晚上 11 点,这是正确的,除非我们不在美国东部标准时间。3. 每当我自己创建一个日期进行测试时,价值5小时的毫秒来区分它和 UTC。显然,这些是不同的“日期”,它失败了。

所以,我猜真正的问题是双重的: 1. 为什么我的控制台认为它是 EST?据我所知,我的 Windows XP 设置是正确的。我知道在 Java 1.4 中曾经有一个问题导致错误的 TZ,但我认为这已经修复并且我正在运行(据说)1.6。2. 为什么dbUnit,它是在同一个JVM中使用正确的花式TZ。

我想我可以停止一起使用日期,但我不一定有那种奢侈。

4

2 回答 2

3

5年后,我希望我能正确理解你的问题,因为你写了很多。不过我有一个类似的问题。

即使我已TimeZone.setDefault(TimeZone.getTimeZone("UTC"));在 Spring 应用程序中设置,DbUnit 或 Hibernate 也将我的 UTC 时间切换为本地时间。-Duser.timezone=EDT正如安迪指出的那样,当我使用时,我的测试通过了。因此,我假设 DbUnit 在实际应用程序启动之前填充其数据库,因此默认时区设置得太晚。

为了避免这种情况,我为 UTC 提出了以下两种解决方法,对于 ETC(或任何其他时区)只需相应地切换它。

定期申请

您的所有测试类都必须设置默认时区。为了不重复我自己,我让我的所有测试都扩展了UtcTimeZoneTest

public class UtcTimeZoneTest {
  static {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
  }
}

public class TestClass extends UtcTimeZoneTest {
  // your tests
}

弹簧应用

在 Spring 应用程序中,您也可以执行相同的操作,但我认为以下内容会更好一些。同样,您所有的测试课程都必须这样做。(虽然我不是 Spring 专家,但我希望这没有缺点。)

public class UtcSpringJUnit4ClassRunner extends SpringJUnit4ClassRunner {
  static {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
  }

  public UtcSpringJUnit4ClassRunner(Class<?> clazz) throws InitializationError {
    super(clazz);
  }
}

@RunWith(UtcSpringJUnit4ClassRunner.class)
public class TestClass {
  // your tests
} 
于 2015-11-06T12:02:13.197 回答
0

你是如何执行你的测试的?尝试将以下 VM 参数添加到命令行(或者您正在执行测试):

-Duser.timezone=EDT
于 2010-09-30T15:11:30.947 回答