使用JPA存储/读取日期时与时区相关的问题

时间:2013-03-07 18:36:49

标签: java jpa

我有一个Java EE 5应用程序(IBM RAD,WebSphere 7.5,Oracle 11)。

我正在使用JPA在我的应用中阅读和编写日期,如下所示:

@Entity
@Table="APPOINTMENT"
public class Appointment implements Serializable {
  /* ... */
  @Temporal(TemporalType.TIMESTAMP)
  private Date lastUpdateTimestamp;
  /* ... */
}

每当我更新约会时,我都会......

myAppointment.setLastUpdateTimestamp(new Date());

...反映更新发生在“现在”。

有两个WebSphere服务器,都指向同一个数据库。

当我的本地开发机器的WebSphere存储更新时间时,它将“now”存储为:

March 7, 2013 1:30pm EST

当生产服务器存储更新时间时,它会将“now”存储为:

March 7, 2013 6:30pm GMT

问题是时区似乎没有存储为时间戳的一部分。因此,当我浏览本地(EST)计算机上的应用程序时,它将显示时间:

March 7, 2013 6:30pm EST 

...如果你跟着我,那将来是5个小时。

我的问题是,如何将时区与Date对象中的日期和时间一起存储到数据库?

任何信息都很有用,谢谢!

罗布

1 个答案:

答案 0 :(得分:1)

事实证明,正确答案是时区根本没有存储在Oracle TIMESTAMP字段中,并且没有办法实现这一点。您必须在存储之前将日期转换为正确的值。

为了记录,这是我考虑的解决方案:

(a)将所有实体bean更改为以长(UTC /纪元时间)而不是Date对象(UTC = myDate.getTime())存储日期,并转换为日期以供显示。决定代码更改太多了。

(b)在写入数据库之前将我的Date对象中的时间转换为GMT。由于转换发生在太多地方,因此我决定对未来的开发人员进行捣乱或忘记在未来的代码增强中添加它。

(c)我将我的开发网络服务器服务器的时区设置为GMT,找到说明here

我去了(c)。