SpringBoot日期格式化处理(单独与全局)

包括单独,与全局

1. 单独配置

1.1 使用Springboot提供注解方式

springboot默认提供,在需要的字段上使用@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")

这个方式每个字段都需要加有点过于麻烦。

1.2. 使用Spring自带注解

@DateTimeFormat(pattern = "yyyy-MM-dd")

这个方式每个字段都需要加有点过于麻烦。

2. 全局配置

2.1 在配置文件上配置

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
  • 支持(content-type=application/json)请求中格式为yyyy-MM-dd HH:mm:ss的字符串,后台用@RequestBody接收,及返回值date转为yyyy-MM-dd HH:mm:ss格式string;

  • 不支持(content-type=application/json)请求中yyyy-MM-dd等类型的字符串转为date;

  • 不支持java8日期api

2.2 使用配置类方式

适合前后端都是json格式交互。

只需要用@Configuration定义一个配置类,注入两个Bean即可完成全局日期响应格式化处理。

@Configuration
public class LocalDateTimeSerializerConfig {/** 注入配置文件格式化的格式 @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")private String pattern;*/private static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";/***  注册响应json格式的LocalDateTime日期格式序列化器,指定格式** @return LocalDateTimeSerializer* @author: zhihao* @date: 2020/4/14*/@Beanpublic LocalDateTimeSerializer localDateTimeSerializer() {return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS));}/** *  注册json请求方式的LocalDateTime反序列化器,指定格式** @return LocalDateTimeDeserializer * @author: zhihao* @date: 2020/4/14 */@Beanpublic LocalDateTimeDeserializer localDateTimeDeserializer() {return new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS));}/***  格式化日期类型,响应对应格式化日期字符串** @return Jackson2ObjectMapperBuilderCustomizer* @author: zhihao* @date: 2020/4/14*/@Beanpublic Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {return builder -> {//返回json格式,前端序列化为字符串builder.serializerByType(LocalDateTime.class, localDateTimeSerializer());//从json对象日期字符串反序列化为日期对象builder.deserializerByType(LocalDateTime.class, localDateTimeDeserializer());};}
}

上面方式如果需要其他格式,那就需要配合@JsonFormat注解使用,在特定的字段属性添加@JsonFormat注解即可,因为@JsonFormat注解优先级比较高,会以@JsonFormat注解标注的时间格式为主。

2.3.使用Jackson解决

JSON请求的序列化和响应Json的反序列化, 适合前后端都是json格式交互。

根据官方文档 Custom JSON Serializers and Deserializers ,想要接管Jackson的JSON的序列化和反序列化,只需通过注解@JsonComponent来声明其静态内部类即可。

首先根据项目要求提供自定义的日期序列化器和反序列化器,其中包括:

  • DateJsonSerializer extends JsonSerializer 表示将LocalDateTime格式化为日期字符串。

  • DateJsonDeserializer extends JsonDeserializer 表示将日期字符串解析为LocalDateTime日期。

    使用注解@JsonComponent是直接处理String和LocalDateTime的相互转换的,所以要注意空串问题。

@JsonComponent
public class DateFormatConfig {/*** 响应json日期格式化*/public static class DateJsonSerializer extends JsonSerializer<LocalDateTime> {@Overridepublic void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");jsonGenerator.writeString(localDateTime.format(formatter));}}/*** 解析json请求日期字符串*/public static class DateJsonDeserializer extends JsonDeserializer<LocalDateTime> {@Overridepublic LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {return LocalDateTime.parse(jsonParser.getText());}}
}

2.4 GET请求及POST表单日期时间字符串格式转换

这种情况要和时间作为Json字符串时区别对待,因为前端json转后端entity底层使用的是Json序列化Jackson工具(HttpMessageConverter<T>);而时间字符串作为普通请求参数传入时,转换用的是Converter<S, T>,两者在处理方式上是有区别。

非json请求的转换

使用自定义参数转换器(Converter)

实现 org.springframework.core.convert.converter.Converter,自定义参数转换器,如下:

@Configuration
public class DateConverterConfig {private static final String YYYY_MM_DD = "yyyy-MM-dd";private static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";/** * 自定义类型转换,HTTP请求日期字符串转换日期类型,* 相当于以前设置进 ConversionServiceFactoryBean** @return Converter<java.lang.String,java.util.Date>* @author: zhihao* @date: 2020/4/14 */@Beanpublic Converter<String, LocalDateTime> localDateTimeConverter() {return new Converter<String, LocalDateTime>() {@Overridepublic LocalDateTime convert(String source) {try {return parse(source);} catch (ParseException e) {e.printStackTrace();}throw new RuntimeException("日期解析错误");}};}/*** 根据字符串进行解析,将Date转LocalDateTime** @param source 日期字符串* @return java.time.LocalDateTime* @author: zhihao* @date: 2020/4/14*/public LocalDateTime parse(String source) throws ParseException {if (StringUtils.isBlank(source)) {return null;}DateFormat format;source = source.trim();//判断是否yyyy-MM-dd格式if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")){format = new SimpleDateFormat(YYYY_MM_DD);Date date = format.parse(source);return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());//判断是否yyyy-MM-dd HH:mm:ss格式}else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")){format = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);Date date = format.parse(source);return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());}else {throw new IllegalArgumentException("Invalid false value " + source);}}
}

点评:以上两个bean会注入到spring mvc的参数解析器(好像叫做ParameterConversionService),当传入的字符串要转为LocalDateTime类时,spring会调用该Converter对这个入参进行转换。

参考了:

https://www.jianshu.com/p/f4654d251104

https://segmentfault.com/a/1190000022355979

SpringBoot日期格式化处理(单独与全局)相关推荐

  1. 奇淫巧技,springboot 全局日期格式化处理,有点香!

    最近面了一些公司,有一些 Java方面的架构.面试资料,有需要的小伙伴可以在公众号[程序员内点事]里,无套路自行领取 说在前边 最近部门几位同事受了一些委屈相继离职,共事三年临别之际颇有不舍,待一切手 ...

  2. SpringBoot日期格式转换,SpringBoot配置全局日期格式转换器

    文章目录 1. SpringBoot设置后台向前台传递Date日期格式 1.1 方式1:配置文件修改 1.2 方式2:在javabean实体类上加注解 I. `@JsonFormat`注解 II. ` ...

  3. CORE-ESP32C3|eink|日期格式化|IO11解锁|墨水屏操作库|SNTP自动同步|局部刷新|全局刷新|LuatOS-SOC接口|官方demo|学习(12):简单日期显示

    目录 基础资料 探讨重点 参考博文: 实现功能 硬件准备 软件版本 日志及soc下载工具 软件使用 接线示意图 IO11解锁教程可参考: 功能1:基于墨水屏的日期显示: 初始化: 日期显示: 功能2: ...

  4. dateformat 返回类型_SpringBoot返回date日期格式化

    SpringBoot返回date日期格式化,解决返回为TIMESTAMP时间戳格式或8小时时间差 问题描述 在Spring Boot项目中,使用@RestController注解,返回的java对象中 ...

  5. 扩展springmvc组件——当页面跳转时,需要在Controller里面创建一个空方法去跳转或者是创建一个配置类  ||日期格式化说明||自定义格式化器||消息转化器扩展fastjson

    在容器中注册视图控制器 当页面跳转时,我们需要在Controller里面创建一个空方法去跳转,那么有没有别的配置方法呢 创建一个WebMvcConfig的配置类   实现WebMvcConfigure ...

  6. 日期格式化时注解@DateTimeFormat无效的问题分析

    日期格式化时注解@DateTimeFormat无效的问题分析 背景 有时候我们在写接口时,需要把前台传来的日期String类型转为Date类型 这时我们可能会用到@DateTimeFormat注解 在 ...

  7. json日期格式化 java_java_Java Web程序中利用Spring框架返回JSON格式的日期,返回Json时格式化日期Date 第一 - phpStudy...

    Java Web程序中利用Spring框架返回JSON格式的日期 返回Json时格式化日期Date第一步:创建CustomObjectMapper类 /** * 解决SpringMVC使用@Respo ...

  8. SpringBoot 日期转换

    SpringBoot 日期转换 前提:     请求参数里面的string转化为date和使用@RequestBody请求将json里面的string转化为date这是两个问题. 1. 传入参数时st ...

  9. 【Java基础系列教程】第十四章 Java 包装类、日期与日期格式化类、数值格式化等常用类详解

    一.包装类 1.1 什么是包装类 Java中的数据类型分为基本数据类型和引用数据类型,其中基本数据类型是不具有对象特征的,也就是说它们不能像对象一样拥有属性和方法,以及对象化交互.           ...

最新文章

  1. linux移走一年前的文件,Shell脚本实现删除一年前文件功能分享
  2. 二十五:设计模式的总结
  3. 谈谈Java运行机制
  4. 绑定变量窥测(Bind Variable Peeking)
  5. concurrent map使用
  6. 计算机网络 socket阻塞非阻塞
  7. java 用户行为记录_大型网站用户行为记录的一个实现
  8. js运算符优先级速查表
  9. Java开发就业前景,2017java开发就业前景分析
  10. NLP聊天机器人笔记
  11. 字体变形html,SVG文字变形动画特效
  12. 安卓4.4.4安装哪个微信版本_微信自动更新在哪里 简单几步轻松关闭微信自动更新方法...
  13. 描写火车站场景_赞美火车的句子(描写火车上情景的句子)
  14. 英国物理学家冷嘲中微子超光速发现
  15. 大一学计算机心得,大一计算机学习心得范文
  16. lol1.7更新服务器维护,LOL7.1版本更新内容时间公告
  17. JS数组定义,遍历,判断是否是数组
  18. 将flash中的代码复制到RAM中运行的方法
  19. 讯飞输入法Linux下载,讯飞输入法-讯飞语音输入法下载 v3.0.1727官方电脑版--pc6下载...
  20. Linux objdump命令(反汇编、查看符号)

热门文章

  1. Netty-心跳检测的作用和实现方法
  2. 墨卡托投影坐标系(Mercator Projection)原理及实现C代码
  3. matlab中的randperm函数
  4. hutool导出excel做单元格合并
  5. Android底层驱动开发 -驱动配置篇
  6. 对http返回状态码301和302
  7. linux离线安装mysql(极速顺畅版
  8. 【机器学习超详细】机器学习案例之SVM人脸识别技术应用 PCA降维 结果可视化 支持向量机
  9. python开机启动代码_python脚本开机启动代码详解
  10. 好家伙,MacOS新版本终于删掉自带Python2,连Python死忠粉都叫好!