亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

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

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

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

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


查看完整回答
反對 回復 2022-07-20
  • 1 回答
  • 0 關注
  • 259 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號