【问题标题】:UTC date insertion in Oracle DB using JPA Hibernate使用 JPA Hibernate 在 Oracle DB 中插入 UTC 日期
【发布时间】: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
  • DateSimpleDateFormatTimestamp 类早已过时且设计不佳。我建议您通常使用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


【解决方案1】:

如果您从 5.2 开始使用休眠版本,则不必手动执行此操作

您可以使用hibernate.jdbc.time_zone 配置属性,如this article 中所述。

基本上,您现在可以使用以下配置属性为所有 TIMESTAMPTIME 列强制使用 UTC 时区:

<property name="hibernate.jdbc.time_zone" value="UTC"/>

【讨论】:

    【解决方案2】:

    问题已解决。下面是对现有代码所做的更改。

    1- 模型更改(实体类) - 将字段作为 TIMESTAMP 类型,

    @Column(name="LAST_WORKED_ON_DTIME")
    private Timestamp LastWorkedOnDtime;
    
    public Timestamp getLastWorkedOnDtime() {
        return LastWorkedOnDtime;
    }
    public void setLastWorkedOnDtime(Timestamp lastWorkedOnDtime) {
        LastWorkedOnDtime = lastWorkedOnDtime;
    }
    

    2- 在持久化之前设置字段值。

    sdheaders.setLastWorkedOnDtime(Timestamp.from(LocalDateTime.now().toInstant( ZoneOffset.UTC ) ));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-22
      • 2016-07-13
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多