第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過 Jackson 序列化 java.sql.Date,同時考慮夏令時

通過 Jackson 序列化 java.sql.Date,同時考慮夏令時

慕的地6264312 2022-07-20 10:54:19
我正在使用 ajava.sql.Date將日期字段存儲在我的一個域?qū)ο笾?。此字段映射?MySQLDATE列。當(dāng)我嘗試通過杰克遜將此字段序列化為 JSON 時,杰克遜似乎沒有考慮夏令時。這是我的域?qū)ο笾性撟侄蔚臉幼樱篅JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "EST")private Date date;如您所見,Jackson 已被指示將時區(qū)解釋為 EST。我的 MySQL 數(shù)據(jù)庫也使用 EST 時區(qū):SHOW VARIABLES LIKE '%zone';Output:system_time_zone | ESTtime_zone        | SYSTEM我的麻煩是,對于夏令時開始和結(jié)束之間的日期,杰克遜返回的日期比數(shù)據(jù)庫中存儲的日期少一天。我假設(shè)這是因?yàn)榻芸诉d沒有考慮夏令時。我通過嘗試將Java 字段中的日期格式從yyyy-MM-dd更改為 來得出這個結(jié)論。yyyy-MM-dd HH:mm:ss我注意到服務(wù)器返回了類似的2017-03-13 00:00:00內(nèi)容,但杰克遜將其序列化為2017-03-12 23:00:00(少一小時,這是夏令時影響的 EST 時間)。有沒有辦法克服這個問題?另外,java.sql.Date考慮到它沒有時間對應(yīng)物,使用正確的類型嗎?我一直在考慮java.time.LocalDate改用,但我還沒有看到它是否會成功。
查看完整描述

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.Datejava.util.Datejava.util.Dateequalsjava.sql.Datejava.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.Instantor代替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 ) ;


查看完整回答
反對 回復(fù) 2022-07-20
  • 1 回答
  • 0 關(guān)注
  • 256 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號