java.util.Date与 java.sql.Date两个包下Date的区别与联系
一般我在項目中導(dǎo)入需要的包,大部分情況下都會根據(jù)IDE的提示自動導(dǎo)入默認(rèn)的包,少數(shù)情況下會掃一眼,看看是不是需要的包,極少情況會斟酌一下,確認(rèn)一下這就是需要的包。
最近在項目中導(dǎo)入JDK中的Date包時,在后來回看代碼的時候,發(fā)現(xiàn)不同的類中導(dǎo)入的Date依賴包還不太一樣,也是那個時候才發(fā)現(xiàn)Date在倆不同的包中。之前沒有注意過這個問題,那這倆包中的日期有什么聯(lián)系與區(qū)別呢?
區(qū)別與聯(lián)系:
這三個類都是對應(yīng)于jdbc處理日期格式的類,只是有著不同的日期精度和格式。
java.sql.Date類:
? 為了與 SQL DATE 的定義一致,由 java.sql.Date 實例包裝的毫秒值必須通過將小時、分鐘、秒和毫秒設(shè)置為與該實例相關(guān)的特定時區(qū)中的零來“規(guī)范化”。
? 【以上來官方api】
簡要的說: 日期格式“規(guī)范化”的java.sql.Date只包含年月日信息,時分秒毫秒都會清零。格式類似:YYYY-MM-DD。當(dāng)我們調(diào)用ResultSet的getDate()方法來獲得返回值時,java程序會參照"規(guī)范"的java.sql.Date來格式化數(shù)據(jù)庫中的數(shù)值。因此,如果數(shù)據(jù)庫中存在的非規(guī)范化部分的信息將會被截取。 也就是說,如果是 2020-12-05 15:15:25 這樣的時間點存取數(shù)據(jù),那么存在數(shù)據(jù)庫中的值就是:2020-12-05 00:00:00
類型轉(zhuǎn)換: 如果把java.sql.Date值通過PrepareStatement的setDate方法存入數(shù)據(jù)庫時,java程序會對傳入的java.sql.Date規(guī)范化,非規(guī)范化的部分將會被劫取。然而,我們java.sql.Date一般由java.util.Date轉(zhuǎn)換過來,如:java.sql.Date sqlDate=new java.sql.Date(new java.util.Date().getTime()). 顯然,這樣轉(zhuǎn)換過來的java.sql.Date往往不是一個規(guī)范的java.sql.Date.要保存java.util.Date的精確值, 需要利用java.sql.Timestamp.
時間顯示格式:
【父類】java.util.Date日期格式為:年月日時分秒
【子類】java.sql.Date日期格式為:年月日[只存儲日期數(shù)據(jù)不存儲時間數(shù)據(jù)]
【子類】java.sql.Time日期格式為:時分秒
【子類】java.sql.Timestamp日期格式為:年月日時分秒納秒(毫微秒)
四種對象內(nèi)部均使用系統(tǒng)時間作為標(biāo)準(zhǔn)數(shù)據(jù) :
·系統(tǒng)時間:自 1970 年 1 月 1 日 00:00:00 GMT 以來的毫秒數(shù),即格林尼治標(biāo)準(zhǔn)時間(GMT)
·本地時間:根據(jù)時區(qū)不同打印出來的時間[當(dāng)時區(qū)為GMT+0時,系統(tǒng)時間與本地時間相同]
我們使用的是以本地時間為參考標(biāo)準(zhǔn)的
針對不同的數(shù)據(jù)庫選用不同的日期類型 :
? 需要了解數(shù)據(jù)庫里存儲時間的精度。
? Date類處理。基本上,數(shù)據(jù)庫通常至少支持三種日期時間字段的形式,即日期、時間和時間戳。在jdbc和它們中的每一個java.util.Date..這三種語言的快速語義如下:java.sql.Date對應(yīng)于sql日期,這意味著它存儲年月日當(dāng)小時、分鐘、秒和毫秒被忽視了。java.sql.Time對應(yīng)于sql time,只包含以下信息:小時、分鐘、秒和毫秒.java.sql.Timestamp對應(yīng)于SQL時間戳,該時間戳的確切日期為納秒(util.Date只支持毫秒!)具有可定制的精度。與這三種類型相關(guān)的使用JDBC驅(qū)動程序時最常見的錯誤之一是,這些類型被錯誤地處理。這意味著sql.Date時區(qū)是特定的嗎,sql.Time包含當(dāng)前年份、月份和日等。最后:用哪一個?實際上取決于字段的SQL類型,Java處理時可以格式化日期。? 有些數(shù)據(jù)庫,比如MySQL,精度為毫秒,然而另一些數(shù)據(jù)庫,包括Oracle,存儲SQL DATE類型數(shù)據(jù)時,毫秒部分的數(shù)據(jù)是不保存的。以下操作中容易出現(xiàn)不易被發(fā)現(xiàn)的BUG:獲得一個JAVA里的日期對象。從數(shù)據(jù)庫里讀取日期試圖比較兩個日期對象是否相等。如果毫秒部分丟失,本來認(rèn)為相等的兩個日期對象用Equals方法可能返回false。.sql.Timestamp類比java.util.Date類精確度要高。這個類包了一個getTime()方法,但是它不會返回額外精度部分的數(shù)據(jù),因此必須使用...總之,java.util.Date 就是Java的日期對象,而java.sql.Date 是針對SQL語句使用的,只包含日期而沒有時間部分。
總結(jié)
以上是生活随笔為你收集整理的java.util.Date与 java.sql.Date两个包下Date的区别与联系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: int、bigint、mediumint
- 下一篇: mybatis-plus中 query