Я борюсь с проблемой. Чем больше я исследую и отлаживаю его, тем больше я думаю, что я не могу полностью его понять.
Мой часовой пояс - ET (UTC -5). Час находится где-то между 21:00 и 21:59. Дата - 8 марта 2014. В этот часовой пояс DST происходит 9 марта 2014 года, когда 1:59:59 становится 3:00:00.
Я хочу сохранить текущее время даты как временную Timestamp
в БД с Hibernate. Для этого я использую класс Jadira PersistentDateTime. Я сохраняю значения UTC, поэтому Jadira меняет текущее время (например, 8 марта 2014 21:30 по восточному времени) до 9 марта 2014 года 02:30 UTC, что верно. Затем он создает Timestamp
из строкового представления времени даты UTC и Timestamp
является 09-MAR-14 03.30.00.000000000 AM
. Когда я возвращаюсь к представлению ET, я получаю 8 марта 2014 года 22:30 ET.
Насколько я понимаю, это неправильно - я должен получить то же самое время.
Мне кажется, что при создании Timestamp
применяется DST, хотя этого не должно быть. Я рассматриваю одну деталь: ET - UTC -5. 21:00 - это именно тот час, когда DST происходит в ET минус 5 часов. Итак, 21:30 ET - 2:30 UTC. 2:30 является недействительным нашим в ET, 8 марта. Возможно, это связано с странным поведением.
Я использую jadira 1.9 (usertype.joda-time-1.9.jar и usertype.spi-1.9.jar) и Hibernate 3.6.0. Моя модель:
@Entity
@Table(name = RUN_STATUS_DATA_DB_TABLE_NAME)
@Access(AccessType.PROPERTY)
public class StatusData implements Identifiable, Serializable {
...
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
@Column(name = RUN_STATUS_COLUMN_POST_EXECUTION_END_TIME)
public DateTime getPostExecutionEndTime() {
return postExecutionEndTime;
}
public void setPostExecutionEndTime(DateTime postExecutionEndTime) {
this.postExecutionEndTime = postExecutionEndTime;
}
}
Код Jadira, создающий неожиданную временную метку, относится к этому классу, в строке 72
Любая мысль о том, почему это происходит? благодаря
После версии Usertype, которую вы используете, было много улучшений и исправлений.
Я предоставил максимально возможную функциональность для Hibernate 3.6 и Java 5. Вы можете использовать этот backport с помощью модуля usertype.core-hibernate36.
В настоящее время вам нужно будет построить это от источника до следующей версии. Получить источники из https://github.com/JadiraOrg/jadira
Кроме того, ознакомьтесь с документацией по адресу http://jadira.sourceforge.net/usertype-userguide.html.
Дайте мне знать, если вы столкнулись с какими-либо проблемами.
Отказ от ответственности: Я поддерживаю Джадиру.