gpt4 book ai didi

java - 在 DST 期间创建时间戳(某种程度上)的问题

转载 作者:太空宇宙 更新时间:2023-11-04 15:02:43 25 4
gpt4 key购买 nike

我正在解决一个问题。我越研究和调试它,我越觉得我可能不完全理解它。

我的时区是东部时间 (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,该 Timestamp09-MAR-14 03.30.00.000000000 AM。当我返回 ET 表示时,我得到 2014 年 3 月 8 日 22:30 ET。

据我了解,这是错误的 - 我应该得到相同的日期时间。

在我看来,在创建时间戳时,会应用DST,尽管不应该如此。我正在考虑一个细节:ET 是 UTC -5。 21:00 正是夏令时发生在 ET 减 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 行

有想过为什么会发生这种情况吗?谢谢

最佳答案

自您使用的 Usertype 版本以来,已有许多增强功能和修复。

我已将尽可能多的功能向后移植到 Hibernate 3.6 和 Java 5。您可以通过使用模块 usertype.core-hibernate36 来使用此向后移植。

目前,您需要从源代码构建它,直到下一个版本。从 https://github.com/JadiraOrg/jadira 获取来源

另外,请查看 http://jadira.sourceforge.net/usertype-userguide.html 中的文档。

如果您遇到任何问题,请告诉我。

免责声明:我维护 Jadira。

关于java - 在 DST 期间创建时间戳(某种程度上)的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22375165/

25 4 0
文章推荐: javascript - 从