我正在使用hibernate与PostgreSQL数据库进行通信,以存储用于建模的数据。在这些模型中,有些时间序列基于没有时区的时间戳。现在,当上载正确创建的时间戳(在本例中为2030年)时,数据库中“ a”列中的2030-03-31T02:00时间戳最终将为2030-03-31T-03:00没有时区的时间戳。我已经更改了数据库配置,使其时区为UTC,但问题仍然存在。
该问题似乎位于驱动程序(https://mvnrepository.com/artifact/org.postgresql/postgresql/42.2.5)或数据库中。将时间戳记插入字符串时,它可以工作。同样,在本地和远程数据库上也会发生此问题。
此外,休眠版本为5.4.2(最新),在我的persistence.xml中,我设置了标志:
<property name="hibernate.jdbc.time_zone" value="UTC"/>
我写的一个小测试看起来像这样:
@Test
public void testTimeShift() {
EntityManager em = JPAUtil.createEntityManager();
TimeStep timeStep = new TimeStep();
LocalDateTime.now(Clock.systemUTC());
LocalDateTime ldt = LocalDateTime.parse("2030-03-31T02:00:00");
timeStep.setTimeStamp(ldt);
SaveToDB.(timeStep, em);
em.close();
EntityManager em2 = JPAUtil.createEntityManager();
TimeStep timeStep2 = LoadFromDB.getTimeStep(ldt, em2);
if (timeStep.getTimeStamp() != timeStep2.getTimeStamp()) {
System.out.println(timeStep.getTimeStamp());
System.out.println(timeStep2.getTimeStamp());
throw new EmptyStackException();
}
}
此代码返回以下内容:
2030-03-31T02:00
2030-03-31T03:00
Process finished with exit code -1
答案 0 :(得分:0)
答案是将时间戳记类型设置为ZonedTimeData。为了方便起见,可以从LocalDateTime进行解析。这样,测试就可以了。
因此,与建议的相比,对于不使用时区的时间步:
@Entity
@Table(name = "`TimeStep`")
public class TimeStep {
@Column(name = "`TimeStamp`")
private ZonedDateTime TimeStamp;
}
创建时间步,然后通过
完成LocalDateTime.now(Clock.systemUTC());
LocalDateTime ldt = LocalDateTime.parse("2030-03-31T02:00:00");
ZonedDateTime zonedDateTime = ZonedDateTime.of(ldt, ZoneId.of("UTC"));
timeStep.setTimeStamp(zonedDateTime);