在DST期间(稍微)创建时间戳的问题

时间:2014-03-13 10:08:53

标签: java datetime timezone jodatime dst

我正在努力解决问题。我调查和调试的越多,我就越觉得我可能完全不了解它。

我的时区是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日期时间的字符串表示构造TimestampTimestamp09-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行

有没有想过为什么会这样? 感谢

1 个答案:

答案 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。