簡體   English   中英

夏令時沒有時區的時間戳中的時間偏移

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM