我正在努力解决问题。我调查和调试的越多,我就越觉得我可能完全不了解它。
我的时区是ET(UTC -5)。时间介于21:00到21:59之间。日期是2014年3月8日。在这个时区,DST发生在2014年3月9日1:59:59变为3:00:00。
我希望将当前日期时间保留为带有Hibernate的数据库中的Timestamp
。为此,我使用了Jadira的PersistentDateTime类。我坚持UTC值,因此Jadira将当前日期时间(让我们说2014年3月8日21:30 ET)改为2014年3月9日02:30 UTC,这是正确的。然后它从UTC日期时间的字符串表示构造Timestamp
,Timestamp
是09-MAR-14 03.30.00.000000000 AM
。当我回到ET代表处时,我将于2014年3月8日22:30 ET。
据我了解,这是错误的 - 我应该得到相同的日期时间。
在我看来,在创建Timestamp
时,会应用DST,尽管它不应该。我正在考虑一个细节:ET是UTC -5。 21:00正好是在东部夏令时减去5小时的DST。所以21:30 ET是2:30 UTC。 3月8日2:30在ET中无效。也许这与这种奇怪的行为有关。
我正在使用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代码位于this class第72行
有没有想过为什么会这样? 感谢
答案 0 :(得分:0)
自您使用的Usertype版本以来,已经有很多增强和修复。
我已将尽可能多的功能向Hibernate 3.6和Java 5移植。您可以使用模块usertype.core-hibernate36来使用此backport。
目前,您需要从源代码构建此代码,直到下一个版本。从https://github.com/JadiraOrg/jadira
获取来源另外,请查看http://jadira.sourceforge.net/usertype-userguide.html
上的文档如果您遇到任何问题,请告诉我。
免责声明:我维持Jadira。