![](/img/trans.png)
[英]ResultSet.getTimestamp(“date”) vs ResultSet.getTimestamp(“date”, Calendar.getInstance(tz))
[英]Can anyone explain the usecase of jdbc resultset getTimestamp(int,calendar)?
我在談論這個接口方法:
最常用的實現是cachedrowset中的實現:
您會注意到實現有兩個非常奇怪的事情:
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.Timestamp
和java.util.Date
類表示時間的實例,與時區無關(或者更確切地說,在固定的UTC時區中)。
如果SQL數據庫中的列沒有存儲時區信息以及日期+時間,那么為了從這樣的時間戳創建Java Date
或TimeStamp
對象需要一個時區,以便它可以及時指向特定的實例(在參考UTC時區)。
有問題的ResultSet.getTimestamp()
方法可用於獲取SQL時間戳數據,並使用參數Calendar
對象中設置的時區信息將其轉換為Java Timestamp
實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.