簡體   English   中英

任何人都可以解釋jdbc結果集getTimestamp(int,calendar)的用法嗎?

[英]Can anyone explain the usecase of jdbc resultset getTimestamp(int,calendar)?

我在談論這個接口方法:

http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#getTimestamp%28int,%20java.util.Calendar%29

最常用的實現是cachedrowset中的實現:

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/com/sun/rowset/CachedRowSetImpl.java line 6170

您會注意到實現有兩個非常奇怪的事情:

1)它修改作為參數傳遞的日歷,即使還有返回值

2)它從SQL中提取所有時間信息, 除了毫秒 ,它來自作為參數傳遞的日歷。

界面描述相當不清楚,但假設實現是正確的 - 這個方法有什么意義? 我可以理解一種方法,它可以使日歷只提取時區,而無需修改它。 但是拿一個日歷,修改它,不僅提取區域而且提取毫秒......

有沒有人對這個API背后的歷史/設計/推理有任何見解?

這似乎是對JDBC API文檔的錯誤解釋(不幸的是, javax.sql.rowset有更多這些錯誤的解釋)。

默認情況下,JDBC驅動程序需要存儲或檢索時間或時間戳,就好像存儲在數據庫中的時間位於JVM的當前時區中一樣。 由於這並不總是你想要的,API提供了提供Calendar對象的方法,你需要使用它來派生實際時區(我不知道為什么他們不使用java.util.TimeZone而是)。

這在PreparedStatement.setTimeStamp中指定:

使用Calendar對象,驅動程序可以計算考慮自定義時區的時間戳。 如果未指定Calendar對象,則驅動程序將使用默認時區,即運行應用程序的虛擬機的時區。

ResultSet的方法getTimestamp遵循(或應該遵循)這些相同的規則。

因此,如果數據庫存儲時間'11:20'並且您的本地時區是CET(UTC + 1),則檢索的時間是10:20 UTC(歐洲中部時間11:20)。 但是,如果我在GMT中提供Calendar ,則返回的時間應為UTC時間11:20(歐洲中部時間12:20)。

SQL數據庫以年,月,日,小時,秒等形式存儲時間戳的日期和時間值。這些值指定的時間實例取決於它們被解釋的時區 (例如2014年1月1日.15 :00:00在歐洲不是在美國的同一時間。 時區可能是可能不是時間戳的一部分,具體取決於列的類型。

Java java.sql.Timestampjava.util.Date類表示時間的實例,與時區無關(或者更確切地說,在固定的UTC時區中)。

如果SQL數據庫中的列沒有存儲時區信息以及日期+時間,那么為了從這樣的時間戳創建Java DateTimeStamp對象需要一個時區,以便它可以及時指向特定的實例(在參考UTC時區)。

有問題的ResultSet.getTimestamp()方法可用於獲取SQL時間戳數據,並使用參數Calendar對象中設置的時區信息將其轉換為Java Timestamp實例。

暫無
暫無

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

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