SpringBoot解析LocalDateTime失败:Uniapp传输时间变1970的原因与解决方案

 更新时间:2025年03月10日 09:19:12   作者:码农研究僧  
这篇文章主要介绍了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失败的资料请关注脚本之家其它相关文章!

相关文章

  • SpringDataJpa写原生sql遇到的问题及解决

    SpringDataJpa写原生sql遇到的问题及解决

    这篇文章主要介绍了SpringDataJpa写原生sql遇到的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Spring Security OAuth2认证授权示例详解

    Spring Security OAuth2认证授权示例详解

    这篇文章主要介绍了Spring Security OAuth2认证授权示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • java实现系统多级文件夹复制

    java实现系统多级文件夹复制

    这篇文章主要为大家详细介绍了java实现系统多级文件夹复制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 利用Spring Boot如何开发REST服务详解

    利用Spring Boot如何开发REST服务详解

    这篇文章主要给大家介绍了关于利用Spring Boot如何开发REST服务的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • SpringMVC post请求的处理

    SpringMVC post请求的处理

    今天小编就为大家分享一篇解决SpringMVC接收不到ajaxPOST参数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-07-07
  • java实现用户自动登录

    java实现用户自动登录

    这篇文章主要为大家详细介绍了java用户自动登录的实现方法,分为六个步骤实现用户自动登录,并验证用户是否已经登录,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • springboot中请求地址转发的两种方案

    springboot中请求地址转发的两种方案

    在开发过程中,我们经常需要将请求从一个服务转发到另一个服务,以实现不同服务之间的协作,本文主要介绍了springboot中请求地址转发的两种方案,感兴趣的可以了解一下
    2023-11-11
  • 使用Java实现压缩文件夹并打包下载

    使用Java实现压缩文件夹并打包下载

    这篇文章主要为大家详细介绍了如何使用Java实现压缩文件夹并打包下载,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • 深入解析Java中的JDBC事务

    深入解析Java中的JDBC事务

    这篇文章主要介绍了深入解析Java中的JDBC事务,包含了Java多线程的事务并发等知识,需要的朋友可以参考下
    2015-08-08
  • Java面向对象之猜拳游戏

    Java面向对象之猜拳游戏

    这篇文章主要为大家详细介绍了Java面向对象之猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05

最新评论