SpringBoot解析LocalDateTime失败:Uniapp传输时间变1970的原因与解决方案
前言
最初的数据格式如下:

具体逻辑是通过前端展示给用户看,后续将其数值带到后端,进行添加,最后以LocalDateTime格式
但发现数据一直都是1970:

1. 问题分析
在 Uniapp 前端传输 yyyy-MM-dd HH:mm:ss 格式的时间到 Spring Boot 后端时,默认 LocalDateTime 解析失败,导致变成 1970-01-01 08:00:00
问题分析:为什么时间变成 1970?
1.1 Uniapp 传输的时间
前端 dayjs 处理时间:inGatTime: dayjs(this.itemData.inGatTime).format('YYYY-MM-DD HH:mm:ss'),
传输到后端的 JSON:
{
"inGatTime": "2025-03-09 19:10:05"
}
这是一个 字符串,而不是 LocalDateTime!
1.2 Spring Boot 默认的 LocalDateTime 解析
如果后端 LocalDateTime 仅仅加了 @JsonFormat 和 @DateTimeFormat:
@Schema(description = "时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime inGatTime;
问题:
- @JsonFormat 仅用于序列化(返回数据给前端),不会影响 反序列化(接收前端传输的数据)
- @DateTimeFormat 只对 Spring MVC 的 URL 参数解析 有效,对 @RequestBody 传输的 JSON 无效
结果是,Spring Boot 无法正确解析 yyyy-MM-dd HH:mm:ss,导致 LocalDateTime 变成 1970-01-01 08:00:00(默认 UNIX 时间戳起点)
但是,加上 @JsonDeserialize(using = LocalDateTimeDeserializer.class) 和 @JsonSerialize(using = LocalDateTimeSerializer.class) 之后,Spring Boot 才能正确解析时间
为什么???
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 = "进闸时间") @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
这个方案最稳定,推荐使用!
3. 前端传 ISO-8601 格式(不推荐,可尝试)
spring Boot 默认支持 ISO-8601 格式(YYYY-MM-DDTHH:mm:ss),前端这样修改:
inGatTime: dayjs(this.itemData.inGatTime).format('YYYY-MM-DDTHH:mm:ss'),
传输数据:
{
"inGatTime": "2025-03-09T19:10:05"
}
后端 LocalDateTime 可以直接解析:
@Schema(description = "进闸时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private LocalDateTime inGatTime;
但这样 LocalDateTime 变成 T 分隔格式,前端接收时要自己处理!
但 我的后端保存到数据还是1970!
4. 用 String(中立)
这个要改字段类型,保持中立,看自身代码好不好修改!
如果 Jackson 解析仍然失败,可以 先用 String 接收,再手动转换 LocalDateTime:
@Schema(description = "进闸时间") private String inGatTime; // 先接收为字符串
然后在 Service 里转换:
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 反序列化无效的情况!
以上就是SpringBoot解析LocalDateTime失败?Uniapp传输时间变1970的原因与解决方案的详细内容,更多关于SpringBoot解析LocalDateTime失败的资料请关注脚本之家其它相关文章!
相关文章
Spring Boot 3 整合 RustFS 实现分布式文件存储的常
本文详解SpringBoot3与RustFS分布式存储系统的整合方法,涵盖环境部署、配置、核心代码实现及高级功能扩展,最终构建高性能、可扩展的文件存储服务,强调其兼容S3协议、开源特性及成本优势,感兴趣的朋友跟随小编一起看看吧2025-09-09
SpringBoot编译target目录下没有resource下的文件踩坑记录
这篇文章主要介绍了SpringBoot编译target目录下没有resource下的文件踩坑记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-08-08
SpringBoot集成FastDFS+Nginx整合基于Token的防盗链的方法
这篇文章主要介绍了SpringBoot集成FastDFS+Nginx整合基于Token的防盗链的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2019-04-04
SpringBoot集成Swagger使用SpringSecurity控制访问权限问题
这篇文章主要介绍了SpringBoot集成Swagger使用SpringSecurity控制访问权限问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-05-05
spring boot 导出数据到excel的操作步骤(demo)
这篇文章主要介绍了spring boot 导出数据到excel的实现步骤,文中通过打开一个平时练习使用的springboot的demo给大家详细介绍,需要的朋友可以参考下2022-03-03


最新评论