[英]Daylight Savings Time shift in Timestamp without timezone
我正在使用hibernate與postgresql數據庫進行通信,以存儲用於建模的數據。 在這些模型中,有時間序列基於沒有時區的時間戳。 現在,在上傳正確創建的時間戳(在本例中為2030年)時,2030-03-31T02:00的時間戳最終為2030-03-31T-03:00,該數據庫中的列是沒有時區的時間戳。 我已經更改了數據庫配置,使其時區為UTC,但問題仍然存在。
問題似乎位於驅動程序( https://mvnrepository.com/artifact/org.postgresql/postgresql/42.2.5 )或數據庫中。 將時間戳插入字符串時,它可以正常工作。 此問題也出現在本地和遠程數據庫上。
另外,hibernate是在版本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
答案是將時間戳的類型設置為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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.