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

时间格式化在项目中使用频率是非常高的 , 当我们的API接口返回结果 , 需要对其中某一个date字段属性进行特殊的格式化处理 , 通常会用到SimpleDateFormat工具处理 。
SimpleDateFormatdateFormat=newSimpleDateFormat("yyyy-MM-dd");DatestationTime=dateFormat.parse(dateFormat.format(PayEndTime()));可一旦处理的地方较多 , 不仅CV操作频繁 , 还产生很多重复臃肿的代码 , 而此时如果能将时间格式统一配置 , 就可以省下更多时间专注于业务开发了 。
【3种Springboot全局时间格式化方式,提高开发效率利器】可能很多人觉得统一格式化时间很简单啊 , 像下边这样配置一下就行了 , 但事实上这种方式只对date类型生效 。
spring.jackson.date-format=yyyy-MM-ddHH:mm:ssspring.jackson.time-zone=GMT+8而很多项目中用到的时间和日期API比较混乱 , java.util.Date、java.util.Calendar和java.timeLocalDateTime都存在 , 所以全局时间格式化必须要同时兼容性新旧API 。
看看配置全局时间格式化前 , 接口返回时间字段的格式 。
@DatapublicclassOrderDTO{privateLocalDateTimecreateTime;privateDateupdateTime;}很明显不符合页面上的显示要求(有人抬杠为啥不让前端解析时间 , 我只能说睡服代码比说服人容易得多~)
一、@JsonFormat注解@JsonFormat注解方式严格意义上不能叫全局时间格式化 , 应该叫部分格式化 , 因为@JsonFormat注解需要用在实体类的时间字段上 , 而只有使用相应的实体类 , 对应的字段才能进行格式化 。
@DatapublicclassOrderDTO{@JsonFormat(locale="zh",timezone="GMT+8",pattern="yyyy-MM-dd")privateLocalDateTimecreateTime;@JsonFormat(locale="zh",timezone="GMT+8",pattern="yyyy-MM-ddHH:mm:ss")privateDateupdateTime;}字段加上@JsonFormat注解后 , LocalDateTime和Date时间格式化成功 。
二、@JsonComponent注解(推荐)这是我个人比较推荐的一种方式 , 前边看到使用@JsonFormat注解并不能完全做到全局时间格式化 , 所以接下来我们使用@JsonComponent注解自定义一个全局格式化类 , 分别对Date和LocalDate类型做格式化处理 。
@JsonComponentpublicclassDateFormatConfig{@Value("${spring.jackson.date-format:yyyy-MM-ddHH:mm:ss}")privateStringpattern;/***@authorxiaofu*@descriptiondate类型全局时间格式化*@date2020/8/3118:22*/@BeanpublicJackson2ObjectMapperBuilderCustomizerjackson2ObjectMapperBuilder(){returnbuilder->{TimeZonetz=TimeZone.getTimeZone("UTC");DateFormatdf=newSimpleDateFormat(pattern);df.setTimeZone(tz);builder.failOnEmptyBeans(false).failOnUnknownProperties(false).featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).dateFormat(df);};}/***@authorxiaofu*@descriptionLocalDate类型全局时间格式化*@date2020/8/3118:22*/@BeanpublicLocalDateTimeSerializerlocalDateTimeDeserializer(){returnnewLocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));}@BeanpublicJackson2ObjectMapperBuilderCustomizerjackson2ObjectMapperBuilderCustomizer(){returnbuilder->builder.serializerByType(LocalDateTime.class,localDateTimeDeserializer());}}看到Date和LocalDate两种时间类型格式化成功 , 此种方式有效 。
但还有个问题 , 实际开发中如果我有个字段不想用全局格式化设置的时间样式 , 想自定义格式怎么办?
那就需要和@JsonFormat注解配合使用了 。
@DatapublicclassOrderDTO{@JsonFormat(locale="zh",timezone="GMT+8",pattern="yyyy-MM-dd")privateLocalDateTimecreateTime;@JsonFormat(locale="zh",timezone="GMT+8",pattern="yyyy-MM-dd")privateDateupdateTime;}从结果上我们看到@JsonFormat注解的优先级比较高 , 会以@JsonFormat注解的时间格式为主 。

注意:在使用此种配置后 , 字段手动配置@JsonFormat注解将不再生效 。

@ConfigurationpublicclassDateFormatConfig2{@Value("${spring.jackson.date-format:yyyy-MM-ddHH:mm:ss}")privateStringpattern;publicstaticDateFormatdateFormat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");@Bean@PrimarypublicObjectMapperserializingObjectMapper(){ObjectMapperobjectMapper=newObjectMapper();JavaTimeModulejavaTimeModule=newJavaTimeModule();javaTimeModule.addSerializer(LocalDateTime.class,newLocalDateTimeSerializer());javaTimeModule.addDeserializer(LocalDateTime.class,newLocalDateTimeDeserializer());objectMapper.registerModule(javaTimeModule);returnobjectMapper;}/***@authorxiaofu*@descriptionDate时间类型装换*@date2020/9/117:25*/@ComponentpublicclassDateSerializerextendsJsonSerializer{@Overridepublicvoidserialize(Datedate,JsonGeneratorgen,SerializerProviderprovider)throwsIOException{StringformattedDate=dateFormat.format(date);gen.writeString(formattedDate);}}/***@authorxiaofu*@descriptionDate时间类型装换*@date2020/9/117:25*/@ComponentpublicclassDateDeserializerextendsJsonDeserializer{@OverridepublicDatedeserialize(JsonParserjsonParser,DeserializationContextdeserializationContext)throwsIOException{try{returndateFormat.parse(jsonParser.getValueAsString());}catch(ParseExceptione){thrownewRuntimeException("Couldnotparsedate",e);}}}/***@authorxiaofu*@descriptionLocalDate时间类型装换*@date2020/9/117:25*/publicclassLocalDateTimeSerializerextendsJsonSerializer{@Overridepublicvoidserialize(LocalDateTimevalue,JsonGeneratorgen,SerializerProviderserializers)throwsIOException{gen.writeString(value.format(DateTimeFormatter.ofPattern(pattern)));}}/***@authorxiaofu*@descriptionLocalDate时间类型装换*@date2020/9/117:25*/publicclassLocalDateTimeDeserializerextendsJsonDeserializer{@OverridepublicLocalDateTimedeserialize(JsonParserp,DeserializationContextdeserializationContext)throwsIOException{returnLocalDateTime.parse(p.getValueAsString(),DateTimeFormatter.ofPattern(pattern));}}} 如果对你有用 , 欢迎在看、点赞、转发 , 您的认可是我最大的动力 。
全网搜:程序员内点事 。
整理了几百本各类技术电子书相送 , 嘘~ , 「免费」送给小伙伴们 , 私信或者评论【666】自行领取 。 和一些小伙伴们建了一个技术交流群 , 一起探讨技术、分享技术资料 , 旨在共同学习进步 。


    推荐阅读