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;}很明显不符合页面上的显示要求(有人抬杠为啥不让前端解析时间 , 我只能说睡服代码比说服人容易得多~)
@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时间格式化成功 。
@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】自行领取 。 和一些小伙伴们建了一个技术交流群 , 一起探讨技术、分享技术资料 , 旨在共同学习进步 。
推荐阅读
- 甲状腺|如果你的脖子有3种异常,就说明甲状腺“病变”严重
- 尿毒症|尿毒症越来越多,医生提醒:少吃3种食物,肾病不敢找你麻烦
- 癌症|不是皮肤病,而是癌症信号?无论男女,当心皮肤这3种异常表现
- 若是每天吃一个“鸡蛋”,提高免疫力,3种错误吃法反而伤身!
- 遇到这3种莴笋,要尽量少买,不新鲜味道差,菜贩子从不给家人吃
- 牛肉不要只会加水炖,多放3种调味料,不用高压锅也能快速软烂
- 肾脏|肾功能障碍,3种异常表现尤为突出,别拖,小心尿毒症找上门
- 经常用3种锅炒菜做饭,堪比“慢性毒药”?通过检测结果告诉你
- 不吃早餐会加速衰老?只不过,3种早餐吃法都不健康,别不承认
- 早餐|长寿的人,偏爱这3种早餐,若你也爱吃,或离长寿更进一步
