SpringBoot解析LocalDateTime失敗:Uniapp傳輸時(shí)間變1970的原因與解決方案
前言
最初的數(shù)據(jù)格式如下:
具體邏輯是通過(guò)前端展示給用戶看,后續(xù)將其數(shù)值帶到后端,進(jìn)行添加,最后以LocalDateTime格式
但發(fā)現(xiàn)數(shù)據(jù)一直都是1970:
1. 問(wèn)題分析
在 Uniapp 前端傳輸 yyyy-MM-dd HH:mm:ss 格式的時(shí)間到 Spring Boot 后端時(shí),默認(rèn) LocalDateTime 解析失敗,導(dǎo)致變成 1970-01-01 08:00:00
問(wèn)題分析:為什么時(shí)間變成 1970?
1.1 Uniapp 傳輸?shù)臅r(shí)間
前端 dayjs 處理時(shí)間:inGatTime: dayjs(this.itemData.inGatTime).format('YYYY-MM-DD HH:mm:ss'),
傳輸?shù)胶蠖说?JSON:
{ "inGatTime": "2025-03-09 19:10:05" }
這是一個(gè) 字符串,而不是 LocalDateTime!
1.2 Spring Boot 默認(rèn)的 LocalDateTime 解析
如果后端 LocalDateTime 僅僅加了 @JsonFormat 和 @DateTimeFormat:
@Schema(description = "時(shí)間") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime inGatTime;
問(wèn)題:
- @JsonFormat 僅用于序列化(返回?cái)?shù)據(jù)給前端),不會(huì)影響 反序列化(接收前端傳輸?shù)臄?shù)據(jù))
- @DateTimeFormat 只對(duì) Spring MVC 的 URL 參數(shù)解析 有效,對(duì) @RequestBody 傳輸?shù)?JSON 無(wú)效
結(jié)果是,Spring Boot 無(wú)法正確解析 yyyy-MM-dd HH:mm:ss,導(dǎo)致 LocalDateTime 變成 1970-01-01 08:00:00(默認(rèn) UNIX 時(shí)間戳起點(diǎn))
但是,加上 @JsonDeserialize(using = LocalDateTimeDeserializer.class)
和 @JsonSerialize(using = LocalDateTimeSerializer.class)
之后,Spring Boot 才能正確解析時(shí)間
為什么???
2. 使用 @JsonDeserialize & @JsonSerialize(推薦)
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import java.time.LocalDateTime; @Schema(description = "進(jìn)閘時(shí)間") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @JsonDeserialize(using = LocalDateTimeDeserializer.class) // 反序列化 @JsonSerialize(using = LocalDateTimeSerializer.class) // 序列化 private LocalDateTime inGatTime;
- @JsonDeserialize(using = LocalDateTimeDeserializer.class)
告訴 Jackson 解析 yyyy-MM-dd HH:mm:ss 格式的字符串為 LocalDateTime - @JsonSerialize(using = LocalDateTimeSerializer.class)
讓 LocalDateTime 按 yyyy-MM-dd HH:mm:ss 格式返回 JSON
這個(gè)方案最穩(wěn)定,推薦使用!
3. 前端傳 ISO-8601 格式(不推薦,可嘗試)
spring Boot 默認(rèn)支持 ISO-8601 格式(YYYY-MM-DDTHH:mm:ss),前端這樣修改:
inGatTime: dayjs(this.itemData.inGatTime).format('YYYY-MM-DDTHH:mm:ss'),
傳輸數(shù)據(jù):
{ "inGatTime": "2025-03-09T19:10:05" }
后端 LocalDateTime 可以直接解析:
@Schema(description = "進(jìn)閘時(shí)間") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private LocalDateTime inGatTime;
但這樣 LocalDateTime 變成 T 分隔格式,前端接收時(shí)要自己處理!
但 我的后端保存到數(shù)據(jù)還是1970!
4. 用 String(中立)
這個(gè)要改字段類型,保持中立,看自身代碼好不好修改!
如果 Jackson 解析仍然失敗,可以 先用 String 接收,再手動(dòng)轉(zhuǎn)換 LocalDateTime:
@Schema(description = "進(jìn)閘時(shí)間") private String inGatTime; // 先接收為字符串
然后在 Service 里轉(zhuǎn)換:
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime parsedTime = LocalDateTime.parse(createReqVO.getInGatTime(), formatter);
適用于 Jackson 反序列化無(wú)效的情況!
以上就是SpringBoot解析LocalDateTime失?。縐niapp傳輸時(shí)間變1970的原因與解決方案的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot解析LocalDateTime失敗的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringDataJpa寫(xiě)原生sql遇到的問(wèn)題及解決
這篇文章主要介紹了SpringDataJpa寫(xiě)原生sql遇到的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Spring Security OAuth2認(rèn)證授權(quán)示例詳解
這篇文章主要介紹了Spring Security OAuth2認(rèn)證授權(quán)示例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09java實(shí)現(xiàn)系統(tǒng)多級(jí)文件夾復(fù)制
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)系統(tǒng)多級(jí)文件夾復(fù)制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08利用Spring Boot如何開(kāi)發(fā)REST服務(wù)詳解
這篇文章主要給大家介紹了關(guān)于利用Spring Boot如何開(kāi)發(fā)REST服務(wù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12springboot中請(qǐng)求地址轉(zhuǎn)發(fā)的兩種方案
在開(kāi)發(fā)過(guò)程中,我們經(jīng)常需要將請(qǐng)求從一個(gè)服務(wù)轉(zhuǎn)發(fā)到另一個(gè)服務(wù),以實(shí)現(xiàn)不同服務(wù)之間的協(xié)作,本文主要介紹了springboot中請(qǐng)求地址轉(zhuǎn)發(fā)的兩種方案,感興趣的可以了解一下2023-11-11