2011-08-10 71 views
3

我在跨SQL,jdbc,JVM和Linux的時區問題摔跤。我無法理解java.sql.date的文檔

我可以看到,我需要交給/從jdbc獲取的類是java.sql.date。所以我讀了文檔,不能做任何事情。

據我瞭解,雙方java.util.Data和java.sql.date持有數量,因爲毫秒爲單位的。

當我看定義的構造java.sql.date它說

「使用給定毫秒時間值構造一個Date對象。如果給定毫秒值包含時間信息,驅動程序會設置在默認時區(對應於零GMT)的默認時區(運行應用程序的Java虛擬機的時區)中的時間組件。「

OK - 問題1 - 什麼都可以「的意思。如果給定毫秒值包含時間信息」 - 顯然它包含了一些時間的信息!

難道他們的意思是「如果毫秒數你給的例行並不代表具體某一天的邊界,考慮到閏秒等等等等」?這聽起來是一個相當隨機的測試,以滿足/失敗!

還是他們的意思是「上天的份上給我們接近中午的東西,我們將它截斷到一天的問題開始

問題2 - 什麼?在的話,這是奇怪的條款「FOR」 - 這顯然是意在使一些齒輪齧合的正常行爲 - 但齒輪是他們

回答

5

java.sql.Datejava.sql.Timejava.sql.Timestamp所有延長java.util.Date,但是:

  • java.sql.Date已經毫秒四捨五入到午夜 - 這是一個「日期與零時間」
  • java.sql.Time具有毫秒不超過24小時 - 它就像一個java.util.Date1970-01-01
  • java.sql.Timestamp有完整的日期和時間 - 像一個普通的java.util.Date
+0

從表面上看,您的答案似乎與發佈的文檔相矛盾。 這表示「驅動程序將時間組件設置爲對應於零GMT的默認時區(運行應用程序的Java虛擬機的時區)」 我想這可能意味着包含的值在某一天或某一天總是在格林尼治標準時間午夜 - 儘管這是一種非常笨拙的說法。 –

+0

如果它表示「一個java.sql.Date對象總是包含某天或其他時間的午夜格林尼治標準時間」,那麼這隻能是JVM在該對象被知道時已知的閏秒數創建。如果閏秒信息後來更新,同一時刻可以倒退到前一天! –

0

如果我是你,我會避免使用毫秒的構造函數。相反,請使用Date.valueOf

+0

但java.sql.Date只有一個毫秒的構造函數 - 另一個不推薦使用。 噢 - 我看到 - 使用零毫秒值構造它,然後使用valueOf方法在其中安裝一段時間 - 嗯,這可能會讓我切斷懷疑的雲。 我需要查看「JDBC日期轉義格式」的規格 –

+0

好的 - 那個奇特的短語似乎意味着「用yyyy-mm-dd格式表示日期」 - 這很簡單。我假設結果代表UTC的午夜 - 或者是我想知道的JVM默認時區的午夜。 –

+0

Right - II看到靜態的valueOf方法是一個僞構造函數...就像instanceOf其他的東西一樣。 TVM –

0

java.sql.Date僅代表日期,沒有任何時間信息。應該使用java.sql.Time

+0

感謝尼瓦斯 - 但我認爲你的意思是「只有UTC的日期,包括創建時已知的閏秒」? –