最美的时光|3种Springboot全局时间格式化方式,提高开发效率利器

时间格式化在项目中使用频率是非常高的 , 当我们的 API 接口返回结果 , 需要对其中某一个 date 字段属性进行特殊的格式化处理 , 通常会用到 SimpleDateFormat 工具处理 。
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");Date stationTime = dateFormat.parse(dateFormat.format(PayEndTime()));可一旦处理的地方较多 , 不仅 CV 操作频繁 , 还产生很多重复臃肿的代码 , 而此时如果能将时间格式统一配置 , 就可以省下更多时间专注于业务开发了 。
可能很多人觉得统一格式化时间很简单啊 , 像下边这样配置一下就行了 , 但事实上这种方式只对 date 类型生效 。
spring.jackson.date-format=yyyy-MM-dd HH:mm:ssspring.jackson.time-zone=GMT+8而很多项目中用到的时间和日期API 比较混乱 ,java.util.Date 、 java.util.Calendar 和 java.time LocalDateTime 都存在 , 所以全局时间格式化必须要同时兼容性新旧 API 。
看看配置全局时间格式化前 , 接口返回时间字段的格式 。
@Datapublic class OrderDTO {private LocalDateTime createTime;private Date updateTime;}很明显不符合页面上的显示要求(有人抬杠为啥不让前端解析时间 , 我只能说睡服代码比说服人容易得多~)
最美的时光|3种Springboot全局时间格式化方式,提高开发效率利器未做任何配置的结果
一、@JsonFormat 注解@JsonFormat 注解方式严格意义上不能叫全局时间格式化 , 应该叫部分格式化 , 因为@JsonFormat 注解需要用在实体类的时间字段上 , 而只有使用相应的实体类 , 对应的字段才能进行格式化 。
@Datapublic class OrderDTO {@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd")private LocalDateTime createTime;@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")private Date updateTime;}字段加上 @JsonFormat 注解后 , LocalDateTime 和 Date 时间格式化成功 。
最美的时光|3种Springboot全局时间格式化方式,提高开发效率利器@JsonFormat 注解格式化
二、@JsonComponent 注解(推荐)这是我个人比较推荐的一种方式 , 前边看到使用 @JsonFormat 注解并不能完全做到全局时间格式化 , 所以接下来我们使用 @JsonComponent 注解自定义一个全局格式化类 , 分别对 Date 和 LocalDate 类型做格式化处理 。
@JsonComponentpublic class DateFormatConfig {@Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")private String pattern;/*** @author xiaofu* @description date 类型全局时间格式化* @date 2020/8/31 18:22*/@Beanpublic Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilder() {return builder -> {TimeZone tz = TimeZone.getTimeZone("UTC");DateFormat df = new SimpleDateFormat(pattern);df.setTimeZone(tz);builder.failOnEmptyBeans(false).failOnUnknownProperties(false).featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).dateFormat(df);};}/*** @author xiaofu* @description LocalDate 类型全局时间格式化* @date 2020/8/31 18:22*/@Beanpublic LocalDateTimeSerializer localDateTimeDeserializer() {return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));}@Beanpublic Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer());}}