1 回答

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