【发布时间】:2014-04-17 23:35:49
【问题描述】:
我正在努力解决一个问题。越调查调试,越觉得自己可能不完全理解。
我的时区是 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 小时的时间。所以 21:30 ET 是 2:30 UTC。 3 月 8 日,美国东部时间 2:30 是无效的。也许这与奇怪的行为有关。
我正在使用 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 行
有没有想过为什么会这样? 谢谢
【问题讨论】:
-
一些术语更正:ET = (EST and EDT)。美国东部时间 = -5,美国东部时间 = -4。但这并不能解释为什么您的时间戳是 3:30 UTC 而不是 2:30 UTC。 请出示您的代码。否则无法进一步帮助您。
-
您使用的是哪个版本的 Jadira,以及哪个数据库?
-
我已经编辑了我的问题以包含所要求的详细信息。
-
这是一个非常旧的用户类型(和休眠)版本。可以升级吗?
标签: java datetime timezone jodatime dst