后端统一处理返回前端日期LocalDateTime格式化去T,Long返回前端损失精度问题

一、前言

我们在实际开发中肯定会遇到后端的时间传到前端是这个样子的: 2022-08-02T15:43:50
这个时候前后端就开始踢皮球了,!!
后端说:前端来做就可!
前端说:后端来做就可!
作为一名有责任感的后端,这种事情怎么能让前端来搞呢!
还有就是Long类型的返回到前端可能会损失精度,这个情况只能后端来做了!

解决方案还是看的开源框架,人家写的,咱就不造轮子了!直接开车!!

二、错误示范

带着 T非常不好,产品要求不带,哈哈,一切按照原型来哦!!

后端统一处理返回前端日期LocalDateTime格式化去T,Long返回前端损失精度问题

下面的 testNum的值是Long类型的最大值: 9223372036854775807,这样就会损失精度成: 9223372036854776000

后端统一处理返回前端日期LocalDateTime格式化去T,Long返回前端损失精度问题

三、导入依赖


    org.springframework.boot
    spring-boot-starter-json

四、编写配置类

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(ObjectMapper.class)
@AutoConfigureBefore(JacksonAutoConfiguration.class)
public class JacksonConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public Jackson2ObjectMapperBuilderCustomizer customizer() {
        return builder -> {
            builder.locale(Locale.CHINA);
            builder.timeZone(TimeZone.getTimeZone(ZoneId.systemDefault()));
            // 设置日期格式
            builder.simpleDateFormat(DatePattern.NORM_DATETIME_PATTERN);
            // 解决long类型损失精度
            builder.serializerByType(Long.class, ToStringSerializer.instance);
            // 日期格式自定义类
            builder.modules(new PigJavaTimeModule());
        };
    }

}
public class JavaTimeModule extends SimpleModule {

    public JavaTimeModule() {
        super(PackageVersion.VERSION);

        // ======================= 时间序列化规则 ===============================
        // yyyy-MM-dd HH:mm:ss
        this.addSerializer(LocalDateTime.class,
                new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)));
        // yyyy-MM-dd
        this.addSerializer(LocalDate.class,
                new LocalDateSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)));
        // HH:mm:ss
        this.addSerializer(LocalTime.class,
                new LocalTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN)));

        // Instant 类型序列化
        this.addSerializer(Instant.class, InstantSerializer.INSTANCE);

        // ======================= 时间反序列化规则 ==============================
        // yyyy-MM-dd HH:mm:ss
        this.addDeserializer(LocalDateTime.class,
                new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)));
        // yyyy-MM-dd
        this.addDeserializer(LocalDate.class,
                new LocalDateDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)));
        // HH:mm:ss
        this.addDeserializer(LocalTime.class,
                new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN)));
        // Instant 反序列化
        this.addDeserializer(Instant.class, InstantDeserializer.INSTANT);
    }

}

五、测试成果

我们发现日期的烦人的 T被去掉了!再也不用踢皮球了哦!!

后端统一处理返回前端日期LocalDateTime格式化去T,Long返回前端损失精度问题

我们发现后端返回的类型为 Long时,会自动变为 String类型,再也不会损失精度了,这个很容易忽视!!

后端统一处理返回前端日期LocalDateTime格式化去T,Long返回前端损失精度问题

如果觉得有用,一键三连起来,小编谢谢大家了!!

有缘人才可以看得到的哦!!!

点击访问!小编自己的网站,里面也是有很多好的文章哦!

Original: https://www.cnblogs.com/wang1221/p/16553421.html
Author: 小王写博客
Title: 后端统一处理返回前端日期LocalDateTime格式化去T,Long返回前端损失精度问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/616864/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 调试webpack

    调试webpack 1. 摘要 用过构建工具webpack的朋友应该都体会,面对其几百行的配置内容如大海一小舟,找不到边。看文档查百度,对其构建的生命周期看了又看。最终还是很茫然。…

    Java 2023年6月13日
    064
  • synchronized锁详解

    synchronized的意义 解决了Java共享内存模型带来的线程安全问题: 如:两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗?(…

    Java 2023年6月16日
    074
  • Java线程处理Future

    ExecutorService service = Executors.newCachedThreadPool(); Future future = service.submit(…

    Java 2023年5月29日
    069
  • 日常白痴_get请求中的特殊字符

    在Get请求中看见 & 早已见怪不怪了,但今天忽然在代码中拼接请求的时候看见了 %20,这就尴尬了,忽然不认得,这是什么东西了,后来查了一下,原来get请求会需要对一些特殊…

    Java 2023年6月7日
    075
  • 1.17(设计模式)观察者模式

    观察者模式定义了对象间一对多的关系,当一个对象状态发生变化时,所有依赖于该对象的对象也将发生变化。 这就可以使用观察者模式,显示十进制数和二进制数依赖于具体的数字,当具体数字发生变…

    Java 2023年6月8日
    079
  • JAVA中计算两个日期时间的差值竟然也有这么多门道

    上半年春招的时候,作为面试官,对于面试表现的不错的同学会要求其写一小段代码看看。题目很简单: 给定一个日期,然后计算下距离今天相差的天数。 本以为这么个问题就是用来活跃面试氛围的,…

    Java 2023年6月7日
    072
  • SpringBoot Error creating bean with name ‘dataSource’ defined in class path resource。。。

    启动spring boot项目出错 解决方法在Application类上增加:@EnableAutoConfiguration(exclude={DataSourceAutoCon…

    Java 2023年5月30日
    060
  • JDK8 Stream

    Stream是Java8 API的新成员,它允许以声明性方式处理数据集合 。 (1) 代码简洁:函数式编程写出的代码简洁且意图明确,使用 _stream_接口让你从此告别 _for…

    Java 2023年6月5日
    0118
  • spring的循环依赖

    1 单例 bean 构造器参数循环依赖(⽆法解决)2 prototype 原型 bean循环依赖(⽆法解决)对于原型bean的初始化过程中不论是通过构造器参数循环依赖还是通过set…

    Java 2023年5月30日
    078
  • Linux:不分区硬盘挂载

    对硬盘分区相当于windows上的磁盘分区,不影响操作,分区之后能将多个分区挂载多个挂载点。 1 给服务器加装硬盘 查看硬盘是否能够识别,命令 fdisk -l 能够识别到硬盘。 …

    Java 2023年6月7日
    074
  • 【RocketMQ】msgId与offsetMsgId

    一. 概念 1. msgId(uniqId) 由 producer客户端 生成,调用方法MessageClientIDSetter.createUniqID()生成全局唯一的Id …

    Java 2023年5月29日
    096
  • 【设计模式】三种工厂模式

    【设计模式】工厂模式 相对来说,写的比较乱,但是看一下实例,其实理解很快 抽象工厂模式(这里主要介绍抽象工厂模式) 核心的工厂类不再负责所有对象的创建,而是将具体的创建工作交给子类…

    Java 2023年6月13日
    072
  • SpringBoot集成RabbitMQ简单举例

    操作步骤: 引入依赖包、配置连接参数、新建队列、生产者代码、消费者代码 依赖包 配置连接参数 新建队列 生产者代码 消费者代码 来源项目:dms-test-data Origina…

    Java 2023年5月30日
    066
  • Vue学习之——–深入理解Vuex之模块化编码(2022/9/4)

    在以下文章的基础上1、深入理解Vuex、原理详解、实战应用:https://blog.csdn.net/weixin_43304253/article/details/126651…

    Java 2023年6月14日
    096
  • devops实践: teamcity实现持续集成

    解决了什么问题? 快速ci cd ; 团队协作效率更高,更快的集成,更快的交付;走gitops模式; 主流的CICD过程: teamcity的架构: 安装方式 docker的方式安…

    Java 2023年6月8日
    098
  • 常用设计模式

    化零为整,把零碎的功能拼成一个整体,对外提供一个统一接口,用来访问子系统中的多个接口。 解耦,不需要一个个对接,使用简单。 单例模式 负责创建对象,同时确保只有单个对象被创建。 线…

    Java 2023年6月7日
    070
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球