【发布时间】:2018-09-14 03:19:16
【问题描述】:
我正在使用 Servicemix 上的 JPA 开发一个 RESTful Web 服务。
我必须在 Oracle DB 中以 UTC 格式存储日期时间戳。我可以使用控制台上的各种解决方案将日期转换为 UTC,但日期仅存储在本地时区。
我使用了以下两种解决方案,它们可以正确打印日期,但在 Oracle 数据库中插入本地时间而不是 UTC。
1-
public static Date utcDate()
{
Date dt = new Date();
Date utcDate=null;
//Try to format your date with the Z or z timezone flags
SimpleDateFormat dateFormatter = new SimpleDateFormat("MMM/dd/yyyy
HH:mm:ss a Z");
String strUTCDate = dateFormatter.format(dt);
System.out.println("UTC Sting - "+strUTCDate);
try{
utcDate=dateFormatter.parse(strUTCDate);
}catch(ParseException ex){System.out.println("Exception while parsing String date to Date Object.");}
System.out.println("UTC Date Obj - "+utcDate);
System.out.println("System Date - "+dt);
return utcDate;
}
2-
Timestamp.from(LocalDateTime.now().toInstant( ZoneOffset.UTC ) )
我正在使用下面的实体在休眠中存储日期
@Temporal(TemporalType.TIMESTAMP)
@Column(name="LAST_WORKED_ON_DTIME")
private Date LastWorkedOnDtime;
public Date getLastWorkedOnDtime() {
return LastWorkedOnDtime;
}
public void setLastWorkedOnDtime(Date lastWorkedOnDtime) {
LastWorkedOnDtime = lastWorkedOnDtime;
}
【问题讨论】:
-
你在数据库中有什么数据类型?您使用的是哪个版本的 JDBC 驱动程序?
-
数据库数据类型为 TIMESTAMP 和 Hibernate 4.3
-
Date、SimpleDateFormat和Timestamp类早已过时且设计不佳。我建议您通常使用java.time, the modern Java date and time API,。现代的 Hibernate 可以直接将这些存储到您的数据库中(对不起,我不知道 Hibernate 版本,所以不知道 4.3 是否有,请自行检查)。 -
如果你被旧的库卡住了,那么也许将它保存为
java.util.Calendar而不是java.util.Date可以工作,因为Calendar存储将传递给 JDBC 驱动程序的时区信息. -
感谢这次更新...
标签: java oracle hibernate jpa utc