我們在 oracle db 中有兩個表,如下所示,
表A => 列DateA(型別DATE)
表B => 列DateB(型別DATE)
表A 中的DateA 列的日期以UTC 格式存盤。TableB 中的 DateB 列的日期存盤在 AEST 中。
當我檢查日期存盤在這些表中的代碼(它在 java 中)時,兩者都只是實體化 Date 型別,如下所示。
現在日期 = 新日期();
當他們使用相同的代碼時,他們如何在不同的時區擁有日期?我想知道其他地方是否還有其他配置?
請提出建議。最終,我需要更新代碼,以便所有日期都存盤在 AEST 中。
uj5u.com熱心網友回復:
表A 中的DateA 列的日期以UTC 格式存盤。TableB 中的 DateB 列的日期存盤在 AEST 中。
不,這兩列都沒有存盤在 UTC 或 AEST 中。DATEOracle 資料庫中的型別只包含日期和時間。該資料型別故意缺少任何時區或UTC 偏移量的概念。您在該列中輸入的任何日期和時間都會被保存,但如果沒有區域/偏移量,我們將無法確定某個時刻(時間軸上的一個點)。
現在日期 = 新日期();
永遠不要Date在 Java 中使用任何一個類。這些糟糕的類是由不了解日期時間處理的人設計的。這些類現在是遺留類,多年前被JSR 310 中定義的現代java.time類取代。
最終,我需要更新代碼,以便所有日期都存盤在 AEST 中。
由于您在現有存盤的資料中丟失了區域/偏移量的背景關系,因此我看不到任何清理混亂的方法。
但是,僅供參考,我可以展示存盤此類資料的正確方法。
首先,將您的資料庫列定義為類似于 SQL 標準型別TIMESTAMP WITH TIME ZONE(與WITHOUT)的資料型別。通過我閱讀此檔案,對于 Oracle 資料庫 21,他將使用同名TIMESTAMP WITH TIME ZONE.
在 Java 中,指定所需的時區。
AEST不是時區。它是是否啟用夏令時 (DST) 的指示器。切勿在您的業務邏輯和存盤資料中使用此類值。僅使用新格式的實時時區名稱Continent/Region。
ZoneId z = ZoneId.of( "Australia/Sydney" ) ;
捕獲與 UTC 零時分秒的偏移量所看到的當前時刻。
Instant instant = Instant.now() ;
調整到您的時區。
ZonedDateTime zdt = instant.atZone( z ) ;
不幸的是,SQL 標準不處理時區。因此,我們必須轉換為 offset 而不是 zone,以便與資料庫交換值。
OffsetDateTime odt = zdt.toOffsetDateTime() ;
通過 JDBC 4.2 或更高版本傳遞。
myPreparedStatement.setObject( … , odt ) ;
恢復。
OffsetDateTime odt = myResultSet( … , OffsetDateTime.class ) ;
調整到您的時區。
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/370304.html
上一篇:JSON模式中的日期物件
下一篇:VBA中日期格式的區別
