1 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超4個贊
博士
永遠(yuǎn)不要使用
java.sql.Date
也不java.util.Date
。
僅使用java.time類。對于僅日期值,請使用
LocalDate
.
您只會看到穩(wěn)定的值,不受夏令時 (DST) 的影響。
例子:
LocalDate.parse( "2019-01-23" )
java.sql.Date
不是日期_
我不確定到底是什么問題,但我懷疑這是由于您使用了可怕的java.sql.Date
課程,因此沒有實(shí)際意義。
該類假裝java.sql.Date
代表一個僅限日期的值,沒有時間和時區(qū)。然而,由于一些難以想象的糟糕設(shè)計決策,該類擴(kuò)展了. 該課程確實(shí)有一個時間,并且是 UTC。更令人困惑的是,在它的源代碼中隱藏了一個時區(qū),沒有 getter 和 setter,所以它似乎還沒有影響像. 因此,盡管它的名稱和目的是僅保存日期,但實(shí)際上確實(shí)將時間設(shè)置為 UTC。所以java.util.Date
java.util.Date
java.util.Date
equals
java.sql.Date
java.sql.Date
在調(diào)整一天中的時間方面有一些技巧,這可能是您遇到的問題。這些傳統(tǒng)的日期時間課程是一大堆熱氣騰騰的……燕麥片。你永遠(yuǎn)不應(yīng)該使用它們。
引用該類的JavaDocjava.sql.Date
:
一個圍繞毫秒值的瘦包裝器,允許 JDBC 將其識別為 SQL DATE 值。毫秒值表示自 1970 年 1 月 1 日 00:00:00.000 GMT 以來經(jīng)過的毫秒數(shù)。
為了符合 SQL DATE 的定義,由 java.sql.Date 實(shí)例包裝的毫秒值必須通過在實(shí)例關(guān)聯(lián)的特定時區(qū)中將小時、分鐘、秒和毫秒設(shè)置為零來“規(guī)范化” .
順便說一句,java.sql.Timestamp
同樣糟糕的是一團(tuán)糟。它也笨拙地繼承自,為納秒java.util.Date
添加了第二個小數(shù)秒。也避免使用此類,現(xiàn)在由java.time.Instant
or代替java.time.OffsetDateTime
。同樣,java.sql.Time
替換為java.time.LocalTime
。
java.time.LocalDate
真的是約會
隨著 JSR 310 和 JDBC 4.2 的采用,您可以使用現(xiàn)代行業(yè)領(lǐng)先的java.time類。到目前為止,Jackson 可能已更新為使用java.time。如果沒有,請參閱此問題以獲取指向杰克遜中處理java.time的數(shù)據(jù)類型模塊的鏈接。
看起來您的輸入字符串采用標(biāo)準(zhǔn)ISO 8601格式,YYYY-MM-DD。java.time類在解析/生成表示日期時間值的字符串時默認(rèn)使用標(biāo)準(zhǔn)格式。對于僅日期使用,LocalDate
真正是沒有時間的日期的類,并且沒有區(qū)域/偏移量。您將看到不受夏令時 (DST)影響的穩(wěn)定日期值。
解析。
LocalDate ld = LocalDate.parse( "2019-01-23" ) ;
店鋪。
myPreparedStatement.setObject( … , ld ) ;
取回。
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
添加回答
舉報