Spring rest接口中的LocalDateTime日期类型转时间戳

 更新时间:2023年03月28日 10:20:59   作者:QiHY  
这篇文章主要介绍了Spring rest接口中的LocalDateTime日期类型转时间戳的方法,Java程序中一般将日期类型定义为LocalDateTime,数据库中保存的时间是0时区的时间

本文介绍spring-rest接口中的LocalDateTime日期类型转时间戳的方法。

具体的代码参照

示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-localdatetime-epoch

一、概述

java程序中一般将日期类型定义为LocalDateTime,数据库中保存的时间是0时区的时间(UTC时间)。对于接口来说,为了支持全球化多时区,接口中的日期类型通常会返回UTC时间戳,简称Epoch,数据类型为long,前端程序会根据本地时区,将时间戳转换为日期格式的字符串,如YYYY-mm-dd HH:mm:ss。

如果在每个时间型字段在接口返回时都进行转换处理,会比较繁琐。应该在一个统一的地方处理这种转换,业务逻辑处理过程中不感知这种转换。

二、通过Jackson2ObjectMapperBuilderCustomizer进行全局类型转换

spring提供了Jackson2ObjectMapperBuilderCustomizer可以用于自定义json与对象之间相互转换的处理。

通过自定义Jackson2ObjectMapperBuilderCustomizer,我们可以在json与对象的相互转换转换阶段完成LocalDateTime和Epoch之间的转换,包括接口的入参和出参。

@Configuration
public class LocalDateTimeToEpochSerdeConfig {
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -> builder.serializerByType(LocalDateTime.class, new LocalDateTimeToEpochSerializer())
                .deserializerByType(LocalDateTime.class, new LocalDateTimeFromEpochDeserializer());
    }
    /**
     * 序列化
     */
    public static class LocalDateTimeToEpochSerializer extends JsonSerializer<LocalDateTime> {
        @Override
        public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers)
                throws IOException {
            if (value != null) {
                long timestamp = value.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
                gen.writeNumber(timestamp);
            }
        }
    }
    /**
     * 反序列化
     */
    public static class LocalDateTimeFromEpochDeserializer extends JsonDeserializer<LocalDateTime> {
        @Override
        public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
            NumberDeserializers.LongDeserializer longDeserializer = new NumberDeserializers.LongDeserializer(Long.TYPE, 0L);
            Long epoch = longDeserializer.deserialize(p, ctxt);
            return LocalDateTime.ofInstant(Instant.ofEpochSecond(epoch), ZoneId.systemDefault());
        }
    }
}

以上代码中分别包含了json的序列化和反序列化操作,在序列化操作中,把LocalDateTime转换为Epoch。

   /**
     * 序列化
     */
    public static class LocalDateTimeToEpochSerializer extends JsonSerializer<LocalDateTime> {
        @Override
        public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers)
                throws IOException {
            if (value != null) {
                long timestamp = value.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
                gen.writeNumber(timestamp);
            }
        }
    }

在反序列化操作中,把Epoch转换为LocalDateTime。

    /**
     * 反序列化
     */
    public static class LocalDateTimeFromEpochDeserializer extends JsonDeserializer<LocalDateTime> {
        @Override
        public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
            NumberDeserializers.LongDeserializer longDeserializer = new NumberDeserializers.LongDeserializer(Long.TYPE, 0L);
            Long epoch = longDeserializer.deserialize(p, ctxt);
            return LocalDateTime.ofInstant(Instant.ofEpochSecond(epoch), ZoneId.systemDefault());
        }
    }

通过以上配置,我们可以在实体类中使用LocalDateTime类型。客户端请求接口时,对于返回结果,自动转换为Epoch数据,对于请求参数,自动从Epoch转换为LocalDateTime。

到此这篇关于Spring rest接口中的LocalDateTime日期类型转时间戳的文章就介绍到这了,更多相关Spring LocalDateTime内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Gradle的使用教程详解

    Gradle的使用教程详解

    Gradle它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,目前也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置,下面通过本文给大家介绍Gradle的使用教程,感兴趣的朋友一起看看吧
    2020-09-09
  • java并发容器ConcurrentHashMap深入分析

    java并发容器ConcurrentHashMap深入分析

    这篇文章主要为大家介绍了java并发容器ConcurrentHashMap使用示例及深入分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 深入理解mybatis的ParamNameResolver

    深入理解mybatis的ParamNameResolver

    ParamNameResolver是 MyBatis 中的一个重要组件,它为 MyBatis 提供了一种方便的方式来获取方法参数的名称,本文主要介绍了深入理解mybatis的ParamNameResolver,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • spring boot 集成shiro的配置方法

    spring boot 集成shiro的配置方法

    要在spring boot上集成其他框架,首先要会spring javaconfig方法,利用此方法同样可以配置其他模块。这篇文章主要介绍了spring boot 集成shiro的配置方法,需要的朋友可以参考下
    2018-01-01
  • SpringBoot + proguard+maven多模块实现代码混淆的方法

    SpringBoot + proguard+maven多模块实现代码混淆的方法

    这篇文章主要介绍了SpringBoot + proguard+maven多模块实现代码混淆的方法,多模块跟单模块一样,在需要混淆模块的pom文件中加入proguard依赖及配置,本文给大家讲解的非常详细,感兴趣的朋友一起看看吧
    2024-02-02
  • Spring Cloud Feign接口返回流的实现

    Spring Cloud Feign接口返回流的实现

    这篇文章主要介绍了Spring Cloud Feign接口返回流的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 一篇文章让你彻底了解Java可重入锁和不可重入锁

    一篇文章让你彻底了解Java可重入锁和不可重入锁

    最近正在阅读Java ReentrantLock源码,始终对可重入和不可重入概念理解不透彻,今天特地整理了本篇文章,让你彻底了解Java可重入锁和不可重入锁,需要的朋友可以参考下
    2021-06-06
  • 一文详解各种ElasticSearch查询在Java中的实现

    一文详解各种ElasticSearch查询在Java中的实现

    Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎,下面这篇文章主要给大家介绍了关于各种ElasticSearch查询在Java中实现的相关资料,需要的朋友可以参考下
    2023-11-11
  • HttpMessageConverter报文信息转换器的深入讲解

    HttpMessageConverter报文信息转换器的深入讲解

    在Spring中内置了大量的HttpMessageConverter,通过请求头信息中的MIME类型,选择相应的HttpMessageConverter,这篇文章主要给大家介绍了关于HttpMessageConverter报文信息转换器的相关资料,需要的朋友可以参考下
    2022-01-01
  • Java实现多个wav文件合成一个的方法示例

    Java实现多个wav文件合成一个的方法示例

    这篇文章主要介绍了Java实现多个wav文件合成一个的方法,涉及java文件流读写、编码转换、解析等相关操作技巧,需要的朋友可以参考下
    2019-05-05

最新评论