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 中,实现接口输出日期格式为时间戳的步骤如下:

  1. 配置日期格式化器:在 Spring Boot 的配置文件中,我们可以配置一个日期格式化器,将日期格式化为时间戳。可以在 application.properties(或 application.yml)中添加以下配置:spring.mvc.format.date=unix。

  2. 定义实体类:我们首先需要定义一个实体类,用于表示需要输出的日期字段:

    public?class?MyEntity?{

    ???private?Date?date;

    ???//?getter?and?setter

    }

  3. 编写控制器:接下来,我们需要编写一个控制器类,用于处理接口请求并返回日期字段的时间戳形式。我们可以使用 @JsonFormat注解来指定日期字段的格式化方式。下面是一个简单的示例:

    @RestController

    public?class?MyController?{

    ???@GetMapping("/entity")

    ???public?MyEntity?getEntity()?{

    ???MyEntity?entity?=?new?MyEntity();

    ???entity.setDate(new?Date());

    ???return?entity;

    ???}

    }

  4. 测试接口:启动 Spring Boot 应用后,我们可以通过访问 /entity接口来获取日期字段的时间戳形式。可以使用 Postman 或浏览器等工具进行测试。

GET /entity HTTP/1.1

Host: localhost:8080

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

复制代码
{
????"date":?1678912345678
}
相关推荐
tg-zm8899961 小时前
2025返利商城源码/挂机自动收益可二开多语言/自定义返利比例/三级分销理财商城
java·mysql·php·laravel·1024程序员节
i***t9191 小时前
Spring Boot项目接收前端参数的11种方式
前端·spring boot·后端
前端达人1 小时前
你的App消息推送为什么石沉大海?看Service Worker源码我终于懂了
java·开发语言
小光学长1 小时前
基于ssm的宠物交易系统的设计与实现850mb48h(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·前端·数据库
编程大师哥2 小时前
vxe-table 透视表分组汇总及排序基础配置
java
8***84822 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
o***74172 小时前
基于SpringBoot的DeepSeek-demo 深度求索-demo 支持流式输出、历史记录
spring boot·后端·lua
9***J6282 小时前
Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
java·spring boot·后端
S***q1922 小时前
Rust在系统工具中的内存安全给代码上了三道保险锁。但正是这种“编译期的严苛”,换来了运行时的安心。比如这段代码:
开发语言·后端·rust