在 DST 期间创建时间戳(有点)的问题

Posted

技术标签:

【中文标题】在 DST 期间创建时间戳(有点)的问题【英文标题】:Issue creating a Timestamp (somewhat) during DST 【发布时间】: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,而Timestamp09-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,以及哪个数据库? 我已经编辑了我的问题以包含所要求的详细信息。 这是一个非常旧的用户类型(和休眠)版本。可以升级吗? 【参考方案1】:

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

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

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

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

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

免责声明:我维护 Jadira。

【讨论】:

以上是关于在 DST 期间创建时间戳(有点)的问题的主要内容,如果未能解决你的问题,请参考以下文章

DST 和 PHP 日期和时间戳

Python:如何在不知道 DST 是不是生效的情况下将时区感知时间戳转换为 UTC

Python 3.9:使用标准库构造 DST 有效时间戳

如何在 Python 中查找同一小时的第二天 Unix 时间戳,包括 DST?

使用 moment.js 将跨越秋季 DST 边界的一系列非 UTC 时间戳转换为 UTC 时间戳的正确方法?

创建 AIR 文件时出错:无法生成时间戳:握手期间远程主机关闭连接