当前位置: 首页 > news >正文

Spring Boot 解析 LocalDateTime 失败?Uniapp 传输时间变 1970 的原因与解决方案

目录

  • 前言
  • 1. 问题分析
  • 2. 时间戳(推荐,可尝试)
  • 3. 使用 @JsonDeserialize & @JsonSerialize(中立)
  • 4. 前端传 ISO-8601 格式(不推荐,可尝试)
  • 5. 用 String(中立)

前言

🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF

最初的数据格式如下:
在这里插入图片描述

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

在这里插入图片描述

1. 问题分析

在 Uniapp 前端传输 yyyy-MM-dd HH:mm:ss 格式的时间到 Spring Boot 后端时,默认 LocalDateTime 解析失败,导致变成 1970-01-01 08:00:00

1️⃣ 问题分析:为什么时间变成 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. 时间戳(推荐,可尝试)

时隔几天,最终确定问题所在,特意补充在第二章的原理分析!

后端获取的数值是1970,是因为前端传输过来的为String类型!

dayjs(this.itemData.inGatTime).format(‘YYYY-MM-DD HH:mm:ss’) 这是String类型,虽然数值显示是时间!

原本this.itemData.inGatTime 是时间戳,那直接把这个时间戳传输到后端也可!

@Schema(description = "进闸时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime inGatTime;

后续是基于前端
dayjs(this.itemData.inGatTime).format(‘YYYY-MM-DD HH:mm:ss’) String类型 传输给后端,但是保存的时候,第三点会无法保存!因为前端还有后端是LocalDateTime格式,只有uniapp可以保存,因为是String类型

3. 使用 @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

这个方案最稳定,推荐使用!

4. 前端传 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!

5. 用 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 反序列化无效的情况!

相关文章:

  • PostgreSQL 18新特性之虚拟生成列
  • Selenium/Playwright/Cypress对比与选型指南
  • 什么是vue的keep-alive?它是如何实现的?具体缓存了什么内容?
  • Qt从入门到入土(八) -打包Qt程序
  • 通义万相 2.1 × 蓝耘智算:AIGC 界的「黄金搭档」如何重塑创作未来?
  • 18天 - 常见的 HTTP 状态码有哪些?HTTP 请求包含哪些内容,请求头和请求体有哪些类型?HTTP 中 GET 和 POST 的区别是什么?
  • 刷题统计 | 第十三届蓝桥杯省赛C++B组
  • AI写论文提示词指令大全,快速写论文
  • 数据库学习笔记
  • 系统架构设计师-第5章 计算机网络
  • 我们在开发时,什么时候用到虚函数和纯虚函数?
  • 修复ubuntu下找不到音频设备的问题
  • Docker开发工具安装大合集
  • 如何撰写专业技术书籍的序言?——完整指南
  • FreeRTOS概述
  • SpringBoot 接入 豆包 火山方舟大模型
  • 共享内存的原理和创建
  • #函数探幽
  • 《深度解析DeepSeek-M8:量子经典融合,重塑计算能效格局》
  • Zemax 中的 CAD 文件性能比较
  • 中国词学研究会原会长、华东师大教授马兴荣逝世,享年101岁
  • 以总理内塔尼亚胡称决心彻底击败哈马斯
  • 光大华夏:近代中国私立大学遥不可及的梦想
  • 4月深圳新房、二手房成交同比均上涨,“5月有望延续积极向好的发展态势”
  • 成立6天的公司拍得江西第三大水库20年承包经营权,当地回应
  • 农行原首席专家兼浙江省分行原行长冯建龙主动投案被查