gpt4 book ai didi

java - 为什么我的时间戳在时区中移动?

转载 作者:行者123 更新时间:2023-11-29 11:55:39 25 4
gpt4 key购买 nike

我在 PostgreSQL 9.1 数据库中的 timestamp without time zone 列中有这个日期:

2012-11-17 13:00:00

它应该使用 UTC,我已经通过选择它作为 UNIX 时间戳(EXTRACT epoch)验证了这一点。

int epoch = 1353157200; // from database
Date date = new Date((long)epoch * 1000);
System.out.println(date.toGMTString()); // output 17 Nov 2012 13:00:00 GMT

但是,当我使用 JPA/Hibernate 读取此日期时,出现了问题。这是我的映射:

@Column(nullable=true,updatable=true,name="startDate")
@Temporal(TemporalType.TIMESTAMP)
private Date start;

但是,我得到的日期是:

2012 年 11 月 17 日 12:00:00 GMT

为什么会发生这种情况,更重要的是,我该如何阻止它?

请注意,我只想存储通用的时间点(如 java.util.Date 所做的那样),我不太关心时区,除了我显然不想他们破坏了我的数据。

您可能已经推断出,连接到数据库的客户端应用程序采用 UTC+1(荷兰)。

此外,Hibernate 在自动生成模式时选择了列类型 timestamp without time zone。那应该是 timestamp with time zone 吗?

最佳答案

如果数据库不提供时区信息,那么 JDBC 驱动程序应该将其视为 JVM 的本地时区(参见 PreparedStatement.setDate(int, Date)):

Sets the designated parameter to the given java.sql.Date value using the default time zone of the virtual machine that is running the application.

Javadoc 和 JDBC 规范没有明确说明 ResultSet 等任何内容,但为了保持一致,大多数驱动程序也会将该规则应用于从数据库检索的日期。如果您想明确控制所用的时区,则需要使用各种 set/getDate/Time/Timestamp 方法,这些方法也接受正确时区的 Calendar 对象。

一些驱动程序还提供连接属性,允许您指定在与数据库进行转换时使用的时区。

关于java - 为什么我的时间戳在时区中移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13430832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com