写入Oracle时使用java.util.Date时区问题

时间:2011-03-02 06:19:48

标签: java oracle hibernate timezone

设置

  • Web应用程序在机器A上运行,系统时间设置为GMT
  • Oracle数据库在机器B上运行,系统时间设置为GMT。 (从双显示+0:00中选择dbtimezone)

问题

Web应用程序使用Hades JPA和Hibernate来编写和读取数据库。表有两列类型为timestamp的列,名为CREATED和MODIFIED。 Web应用程序使用joda DateTime获取java.util.Date对象并将其写入DB。第一次创建条目时,情况很好,两个字段都在GMT中设置了时间。但是一旦这一行被更新,MODIFIED列就会在PST中设置。

在创建期间和修改期间执行相同的代码部分以设置日期值(它尝试从joda DateTime获取java.util.Date,如上所述)。

有人可以解释这种行为吗?

我注意到的另一件事是在上面的设置中,如果在Web应用程序中我使用新的Date()设置日期列,则将其设置为PST。当应用程序和数据库都在设置为GMT的计算机上运行时,我无法将时区作为PST。

编辑:TimeZone.getDefault()在两台机器上打印GMT。

1 个答案:

答案 0 :(得分:2)

通过调用java.util.TimeZone.getDefault()来检查JVM认为它正在运行的时区。这将是它从jdbc驱动程序读取时应用于Date的时区。虽然我已经使用了hibernate,但我不确定它在时区上的可配置性。不过,我会说它是在呼唤java.sql.ResultSet.getDate()。此函数具有重载getDate(String columnLabel, Calendar cal),允许您指定从数据库读取的列的时区。这可能是问题的根本原因。如果Hibernate正在调用默认值getDate(String columnLabel),那么很可能问题是你的JVM认为它所在的时区不是GMT。