SpringBoot几种常用的接口日期格式化方法

 更新时间:2024年11月08日 10:01:07   作者:尘世中-迷途小书童  
在 Springboot 应用程序中,日期时间格式化处理是非常重要的一方面,本文将总结SpringBoot几种常用的接口日期格式化方法,通过示例代码介绍了非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

全局时间格式化

通过在配置文件中设置可以实现全局时间格式化。在 Spring Boot 的配置文件 application.properties(或 application.yml)中添加以下两行配置:

# 格式化全局时间字段
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
# 指定时间区域类型
spring.jackson.time-zone=GMT+8

实现原理分析:Controller 在返回数据时,会自动调用 Spring Boot 框架中内置的 JSON 框架 Jackson,对返回的数据进行统一的 JSON 格式化处理。在处理过程中,它会判断配置文件中是否设置了 “spring.jackson.date-format=yyyy-MM-dd HH:mm:ss”,如果设置了,那么 Jackson 框架在对时间类型的字段输出时就会执行时间格式化的处理,从而实现全局时间字段的格式化功能。

部分时间格式化

在某些场景下,不需要对全局的时间都进行统一处理,可以使用注解的方式实现部分时间字段的格式化。在实体类 UserInfo 中添加 @JsonFormat 注解,实现代码如下:

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
 
@Data
public class UserInfo {
    private int id;
    private String username;
    // 对 createtime 字段进行格式化处理
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", timezone = "GMT+8")
    private Date createtime;
    private Date updatetime;
}

自定义参数转换器

在 Spring Boot 中,可以使用自定义参数转换器实现日期格式化。实现 org.springframework.core.convert.converter.Converter接口,自定义参数转换器,如下:

@Configuration
public class DateConverterConfig {
    @Bean
    public Converter<String, LocalDate> localDateConverter() {
        return new Converter<String, LocalDate>() {
            @Override
            public LocalDate convert(String source) {
                return LocalDate.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
            }
        };
    }
    @Bean
    public Converter<String, LocalDateTime> localDateTimeConverter() {
        return new Converter<String, LocalDateTime>() {
            @Override
            public LocalDateTime convert(String source) {
                return LocalDateTime.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            }
        };
    }
}

在使用自定义参数转换器时可能会遇到一些问题。例如,将匿名内部类的写法精简成 lambda 表达式的方式时,启动项目可能会出现异常。原因是 lambda 表达式的接口是 Converter,不能得到具体的类型。解决办法有两种:一是不使用 lambda 表达式,老老实实使用匿名内部类;二是等 requestMappingHandlerAdapter bean 注册完成之后再添加自己的 converter,这样就不会注册到 FormattingConversionService中。

此外,还可以对前端传递的 string 进行正则匹配,如 yyyy-MM-dd HH:mm:ss、yyyy-MM-dd、HH:mm:ss等,以适应多种场景。

使用 Spring 注解

Spring 自带注解 @DateTimeFormat可以进行日期格式化。它通常用于将字符串格式的日期转换为日期类型。在需要进行日期格式转换的 Date属性上添加注解 @DateTimeFormat(pattern = "需要转换的格式")。例如:

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthday;

使用 @DateTimeFormat注解时需要注意,pattern指定的格式是和传入的参数的格式相对应。如果格式不对应,可能会抛出异常。

使用 ControllerAdvice 配合 initBinder

在 controller 做环切时,可以使用 initBinder进行时间格式化。新建 InitBinderDateController类,进行全局时间入参格式化:

@ControllerAdvice
public class InitBinderDateController {
    /**
     * 将前台传递过来的日期格式的字符串,自动转化为时间类型
     * [拦截不到@RequestBody注解修饰的参数]
     */
    @InitBinder("date")
    public void initBinder(WebDataBinder binder) {
        // Date 类型转换
        //        DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //        binder.registerCustomEditor(Date.class,new CustomDateEditor(dateFormat, true));
        //       System.out.println("test");
        // LocalDateTime 类型转换
        binder.registerCustomEditor(LocalDateTime.class, new PropertyEditorSupport() {
            @Override
            public void setAsText(String text) {
                if (!StringUtils.isEmpty(text)) {
                    setValue(LocalDateTime.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            }
        });
    }
}

后端全局设置

可以通过配置后端实现全局请求日期格式转换。例如,在配置文件中配置:

spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

或者使用配置类方式,适合前后端都是 json 格式交互。只需要用 @Configuration定义一个配置类,注入两个 Bean即可完成全局日期响应格式化处理。

@Configuration
public class LocalDateTimeSerializerConfig {
    private static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    @Bean
    public LocalDateTimeSerializer localDateTimeSerializer() {
        return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS));
    }
    @Bean
    public LocalDateTimeDeserializer localDateTimeDeserializer() {
        return new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS));
    }
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -> {
            builder.serializerByType(LocalDateTime.class, localDateTimeSerializer());
            builder.deserializerByType(LocalDateTime.class, localDateTimeDeserializer());
        };
    }
}

接口输出日期格式为时间戳

在 Spring Boot 中,实现接口输出日期格式为时间戳的步骤如下:

  • 配置日期格式化器:在 Spring Boot 的配置文件中,我们可以配置一个日期格式化器,将日期格式化为时间戳。可以在 application.properties(或 application.yml)中添加以下配置:spring.mvc.format.date=unix。
  • 定义实体类:我们首先需要定义一个实体类,用于表示需要输出的日期字段:
public class MyEntity {
    private Date date;
    // getter and setter
}
  • 编写控制器:接下来,我们需要编写一个控制器类,用于处理接口请求并返回日期字段的时间戳形式。我们可以使用 @JsonFormat注解来指定日期字段的格式化方式。下面是一个简单的示例:
@RestController
public class MyController {
    @GetMapping("/entity")
    public MyEntity getEntity() {
        MyEntity entity = new MyEntity();
        entity.setDate(new Date());
        return entity;
    }
}
  • 测试接口:启动 Spring Boot 应用后,我们可以通过访问 /entity接口来获取日期字段的时间戳形式。可以使用 Postman 或浏览器等工具进行测试。

GET /entity HTTP/1.1

Host: localhost:8080

响应结果将会是一个 JSON 格式的对象,其中日期字段将以时间戳的形式表示。例如:

{
    "date": 1678912345678
}

到此这篇关于SpringBoot几种常用的接口日期格式化方法的文章就介绍到这了,更多相关SpringBoot接口日期格式化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot集成分页插件PageHelper的配置和使用过程

    SpringBoot集成分页插件PageHelper的配置和使用过程

    这篇文章主要介绍了SpringBoot集成分页插件PageHelper的配置和使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • java与JSON数据的转换实例详解

    java与JSON数据的转换实例详解

    这篇文章主要介绍了java与JSON数据的转换实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • SpringBoot图文并茂讲解登录拦截器

    SpringBoot图文并茂讲解登录拦截器

    其实spring boot拦截器的配置方式和springMVC差不多,只有一些小的改变需要注意下就ok了,下面这篇文章主要给大家介绍了关于如何在Springboot实现登陆拦截器功能的相关资料,需要的朋友可以参考下
    2022-06-06
  • Java中的HashMap源码分析

    Java中的HashMap源码分析

    这篇文章主要介绍了Java中的HashMap源码分析,散列表是根据关键码值(Key value)而直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数,存放记录的数组叫做散列表,需要的朋友可以参考下
    2023-09-09
  • SpringBoot+Eureka实现微服务负载均衡的示例代码

    SpringBoot+Eureka实现微服务负载均衡的示例代码

    这篇文章主要介绍了SpringBoot+Eureka实现微服务负载均衡的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • 解决mybatis中resultType取出数据顺序不一致的问题

    解决mybatis中resultType取出数据顺序不一致的问题

    这篇文章主要介绍了解决mybatis中resultType取出数据顺序不一致的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • springboot日志切面通用类实例详解

    springboot日志切面通用类实例详解

    这篇文章主要介绍了springboot日志切面通用类,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Java多线程窗口售票问题实例

    Java多线程窗口售票问题实例

    这篇文章主要介绍了Java多线程窗口售票问题实例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 23种设计模式(5) java适配器模式

    23种设计模式(5) java适配器模式

    这篇文章主要为大家详细介绍了23种设计模式之java适配器模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • jackson序列化和反序列化的应用实践指南

    jackson序列化和反序列化的应用实践指南

    这篇文章主要给大家介绍了关于jackson序列化和反序列化的应用实践指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09

最新评论