使用JPA将UTC时间戳存储到数据库

时间:2016-04-29 08:30:42

标签: java sql database jpa timestamp

有下表(供应商没有区别 - 我个人尝试过Oracle和PgSQL):

CREATE TABLE times (
  id INTEGER PRIMARY KEY,
  time TIMESTAMP
);

和JPA实体:

@Entity
@Table(name = "times")
public class TimeEntity {

    @Id
    @Column
    public Long id;

    ???
    public ??? time;
}

有没有办法以某种方式完成实体,将日期时间值存储为UTC时间戳?例如。 java.util.Date.getTime()方法返回的相同值。

我已经尝试Calendar使用不同的时区,java.util.Datejava.sql.DateTimestamp,不同的时间类型,但没有任何成功。尝试使用WebSphere和Spring + Hibernate + Tomcat,使用Oracle和PostgreSQL(只是出于好奇)。

它的值总是最终转移到服务器的默认时区。 以下列方式在DB中检查的值:select (extract(epoch from time)) from times;

我发现将值存储为UTC的唯一方法是仅使用JDBC和PreparedStatement。但这并不是一个真正的选择,因为我们正在将基于EJB / JPA的大型应用程序集成到现有的基础架构中,现有的数据库和应用程序分布在三个不同的时区。这就是为什么我们需要所描述的UTC时间戳值。

这真的是一项不可能完成的任务,还是我错过了一些明显的东西?我有点希望后来。

编辑,示例:

到目前为止我尝试过的所有实现的存储值都是在这一刻: 1462017276(2016年4月30日星期六11:54:36),这是我们目前在悉尼的时间。

我需要它是 1461981275(星期六,2016年4月30日01:54:35),由Date.getTime()给出。

2 个答案:

答案 0 :(得分:0)

Oracle中的TIMESTAMP不支持时区。

你应该考虑使用:

var btn = document.getElementById('butt_1');

btn.addEventListener('click', function(e) {
// your code 
});

更多信息:

https://docs.oracle.com/cd/B19306_01/server.102/b14225/ch4datetime.htm#i1006081 https://docs.oracle.com/cd/B19306_01/server.102/b14225/ch4datetime.htm#i1006169

答案 1 :(得分:-1)

我认为使用这些注释解决了这个问题     @Column(name =“DATETIME_FIELD”)     @Temporal(TemporalType.TIMESTAMP) private java.util.Calendar time;