簡體   English   中英

按Java java.sql.Timestamp中的方式檢索Oracle Date / Timestamp字段,而無需轉換為DST

[英]Retrieve Oracle Date/Timestamp field as is in Java java.sql.Timestamp without converting to DST

我在DATE數據類型的oracle中有column(LOGIN_TIME)。 我正在嘗試使用JDBC將其讀取為Java中的時間戳。 該表中的行之一的值為2006-04-02 02:00:01.0。 當我做

從TABLE中選擇LOGIN_TIME,CAST(LOGIN_TIME作為TIMESTAMP);

我看到sql-developer將值顯示為

2006-04-02 02:00:01.0

但是,當我使用ResultSet.getTimestamp()方法在Java中檢索此列值時,我看到的值為2006-04-02 03:00:01.0。

經過大量的搜尋后,我了解到

  1. 首先,由於夏令時,2006-04-02 01:59:00.0之后的2006-04-02 02:00:01.0無效/丟失時間,時鍾點擊2006-04-02 03:00:00.0。
  2. Oracle Date / Timestamp數據類型不維護時區,因此Oracle在插入數據庫時​​毫無保留地接受了該值。
  3. 但是,由於02:00:01是無效時間,因此Java默認會寬大對待它,並將時間轉換為假定的正確時間03:00:01。

現在,我的問題是

  1. 為什么Java假定正確的時間為03:00:01? 它是否取決於任何時區,如果是,默認時區是什么? 我不認為此處的默認時區是UTC,因為

System.out.println(+ rs.getTimestamp(index,Calendar.getInstance(TimeZone.getTimeZone(“ UTC”)))));;

給我的價值是

2006-04-01 18:00:01.0

  1. 如何在沒有通過JDBC進行DST轉換的情況下從Oracle檢索值,如2006-04-02 02:00:01.0? 或將其獲取為2006-04-02 03:00:01.0並將其轉換回原始的oracle值2006-04-02 02:00:01.0。

Java中的Date不存儲時區。 而是使用您當地的時區來表示值。 這就是為什么您看到不同的結果的原因。

如果使用Java 8和JDBC 4.2,則可能要使用更可靠的java.time.*包。 就這么簡單:

LocalDateTime dateTime = rs.getObject(index, LocalDateTime.class);

如果要將LocalDateTime轉換為java.util.Date ,可以通過以下方式實現:

 Instant instant = dateTime.atZone(ZoneId.systemDefault()).toInstant();
 Date dateFromOld = Date.from(instant);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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