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

虚幻大学 xuhss 160℃ 0评论

? 优质资源分享 ?

学习路线指引(点击解锁) 知识定位 人群定位
? Python实战微信订餐小程序 ? 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
?Python量化交易实战? 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

一、前言

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

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

二、错误示范

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

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

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

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

三、导入依赖


<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-jsonartifactId>
dependency>

四、编写配置类

@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被去掉了!再也不用踢皮球了哦!!

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

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

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

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


有缘人才可以看得到的哦!!!
点击访问!小编自己的网站,里面也是有很多好的文章哦!

转载请注明:xuhss » 后端统一处理返回前端日期LocalDateTime格式化去T,Long返回前端损失精度问题

喜欢 (0)

您必须 登录 才能发表评论!