在 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
,而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,以及哪个数据库? 我已经编辑了我的问题以包含所要求的详细信息。 这是一个非常旧的用户类型(和休眠)版本。可以升级吗? 【参考方案1】:自您使用的 Usertype 版本以来,已经有很多增强和修复。
我已将尽可能多的功能向后移植到 Hibernate 3.6 和 Java 5。您可以通过使用模块 usertype.core-hibernate36 来使用此向后移植。
目前您需要从源代码构建它,直到下一个版本。从https://github.com/JadiraOrg/jadira获取源码
另外,请查看http://jadira.sourceforge.net/usertype-userguide.html的文档
如果您遇到任何问题,请告诉我。
免责声明:我维护 Jadira。
【讨论】:
以上是关于在 DST 期间创建时间戳(有点)的问题的主要内容,如果未能解决你的问题,请参考以下文章
Python:如何在不知道 DST 是不是生效的情况下将时区感知时间戳转换为 UTC
如何在 Python 中查找同一小时的第二天 Unix 时间戳,包括 DST?