Как мне сделать так, чтобы dbUnit или hibernate перестали вычитать час из моих свиданий? - PullRequest
3 голосов
/ 29 сентября 2010

Итак, у меня есть XML-файл, который я использую с dbUnit в качестве источника данных, и в нем есть некоторые даты.Дата в файле выглядит примерно так: «2010-02-04», но как только она загружается, и я получаю доступ к ней для печати или сравнения в тестах, она думает, что это «2010-02-03 23:00».

Я предполагаю, что это связано с EDT / EST, но я не уверен, как заставить dbUnit (или, возможно, hibernate?) Использовать правильный часовой пояс.

Кто-нибудь имеетлюбой опыт работы с dbUnit и датами?

Спасибо, Питер

РЕДАКТИРОВАТЬ
Хорошо, я уверен, что по какой-то причине он считывает дату как EDT, и это правильно, затемхранить его как EST, что не является технически правильным (мы здесь EDT), но верно для моего компьютера, который говорит, что это EST.Это преобразование приводит к тому, что дата «теряет» час.Не уверен, почему Java думает, что мы EST (Windows XP знает, что мы нет), и вдвойне не уверен, почему dbUnit считает, что дата должна быть EDT, поскольку, как и Java, она, вероятно, должна считывать неправильный часовой пояс как EST.Это довольно странно.

РЕДАКТИРОВАТЬ Я взял XML Hibernate, потому что это не проблема.После дальнейших осмотров, вот что происходит: 1. dbUnit считывает дату как строку из исходного XML и преобразует ее в java.sql.Date.По своей природе они не хранят часы / минуты / секунды, но когда вы смотрите на миллис, он явно корректируется на 4 часа, чтобы показать, что, хотя здесь, в EDT, полночь, в UTC 4 часа утра.Кроме того, это поддерживается календарем, который имеет часовой пояс с надписью «Америка / Нью-Йорк» или что-то эквивалентное.Я не могу точно вспомнить.2. Всякий раз, когда я печатаю эту дату, моя система, которая считает, что это EST, реконвертирует 4:00 UTC до 23:00 предыдущего дня, что было бы правильно, если только мы не в EST.3. Всякий раз, когда я сам создаю дату для тестирования в качестве примера, поскольку моя JVM считает, что мы находимся в EST, она добавляет пять часов в миллис, чтобы сделать разницу между ней иУНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ.Ясно, что это разные «даты», и они терпят неудачу.

Итак, реальный вопрос, я думаю, двоякий: 1. Почему моя консоль считает, что это EST?Насколько я знаю, мои настройки Windows XP верны.Я понимаю, что раньше в Java 1.4 была проблема с неправильным TZ, но я думаю, что это было исправлено, и я работаю (предположительно) 1.6.2. Почему dbUnit, который находится в той же JVM, использует правильный модный TZ.

Полагаю, я мог бы прекратить использовать даты все вместе, но у меня нет такой роскоши.

Ответы [ 2 ]

2 голосов
/ 06 ноября 2015

5 лет спустя, я надеюсь, я правильно понимаю вашу проблему, потому что вы написали довольно много. Тем не менее у меня была похожая проблема.

DbUnit или Hibernate переключили время UTC на местное время, хотя я установил TimeZone.setDefault(TimeZone.getTimeZone("UTC")); в своем приложении Spring. Когда я использовал -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
} 
0 голосов
/ 30 сентября 2010

Как вы выполняете свои тесты?Попробуйте добавить следующий аргумент VM в командную строку (или, тем не менее, выполняете свои тесты):

-Duser.timezone=EDT
...