Вставка даты UTC в базу данных Oracle с использованием JPA Hibernate - PullRequest
0 голосов
/ 14 сентября 2018

Я занимаюсь разработкой веб-службы RESTful с использованием JPA на Servicemix.

Я должен хранить метку времени в формате UTC в базе данных Oracle. Я могу конвертировать дату в UTC, используя различные решения на консоли, но дата хранится только в местном часовом поясе.

Я использовал ниже два решения, которые правильно печатают дату, но вставляют местное время, а не UTC, в базу данных Oracle.

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;
}

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Проблема решена.Ниже приведены изменения, внесенные в существующий код.

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 ) ));
0 голосов
/ 14 сентября 2018

Вам не нужно делать это вручную, если вы используете версию hibernate начиная с версии 5.2

. Вы можете использовать свойство конфигурации hibernate.jdbc.time_zone, как описано в этой статье . * 1006.*

По сути, теперь вы можете принудительно устанавливать часовой пояс UTC для всех столбцов TIMESTAMP и TIME, используя следующее свойство конфигурации:

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