SpringBoot全局时间date和localDateTime格式失效问题记录

摘要:
˃˃转换器){MappingJackson2HttpMessageConverterconverter=newMappingJackson2HHttpMessageConverter();ObjectMapprojectMapper=converter.getObjectMapper();//时间格式objectMapper.config;objectMapper.setDateFormat;//设置格式内容转换器。setObjectMapper;Converters.add;}}实现效果返回的时间是您自己定义的格式传入参数处理当我们的接收时间类型为localDateTime时,前端传递给我们的格式为yyyy-MM-ddHH:MM:ss。后端将报告错误Causedby:java。时间总体安排DateTimeParseException:文本“2021-06-1114:02:40”无法解析destinindex10解决方案:@ConfigurationpublicclassLocalDateTimeSerializerConfig{@ValueprivateStringpattern;/***localDateTime输入参数转换*@return*/@BeanpublicObjectMapperserializingObjectMapper(){JavaTimeModule=newJavaTimeModule() ; LocalDateTimeDeserializerdateTimeDeserilizer=newLocalDateTimeDeserializer;模块.addDeserializer;returnJackson2ObjectMapperBuilder.json().modules.featuresToDisable.build();}}3、 当输入和输出参数与第一个和第二个处理同时处理时,使用ObjectMapper来处理它们,但这两个源是不同的。当两者同时存在时,将首先继承WebMvcConfigurer。

一、出参处理

springBoot项目中使用注解@ResponseBody或者@RestController默认使用Json格式返回数据。

默认返回的格式是这样的"2021-04-28T07:01:45.000+00:00",如下

 

我们可能想要返回给前端是yyyy-MM-dd HH:mm:ss 这样的格式

全局配置

若此配置无效,返回的时间还是上面那种中间带‘T’的那种格式的话,

解决方案

实现WebMvcConfigurer的extendMessageConverters方法

     
    @Configuration
    public class DateTimeSerializerConfig implements WebMvcConfigurer {
     
        @Value("${spring.jackson.date-format}")
        private String pattern;
     
        /**
         * 时间出参序列化
         * 使用此方法, 以下 spring-boot: jackson时间格式化 配置 将会失效
         * spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
         * spring.jackson.time-zone=GMT+8
         * 原因: 会覆盖 @EnableAutoConfiguration 关于 WebMvcAutoConfiguration 的配置
         * */
        @Override
        public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
            MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
            ObjectMapper objectMapper = converter.getObjectMapper();
            // 时间格式化
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            objectMapper.setDateFormat(new SimpleDateFormat(pattern));
            // 设置格式化内容
            converter.setObjectMapper(objectMapper);
            converters.add(0, converter);
        }
    }

实现效果

返回的时间是自己定义的格式了

 
二、入参处理

当我们接收时间的类型是localDateTime类型时,前端传给我们的格式是

这样的yyyy-MM-dd HH:mm:ss

后端会报错Caused by: java.time.format.DateTimeParseException: Text '2021-06-11 14:02:40' could not be parsed at index 10

 

解决方案:

     
    @Configuration
    public class LocalDateTimeSerializerConfig {
     
        @Value("${spring.jackson.date-format}")
        private String pattern;
     
        /**
         * localDateTime入参转换
         * @return
         */
        @Bean
        public ObjectMapper serializingObjectMapper() {
                    JavaTimeModule module = new JavaTimeModule();
                   LocalDateTimeDeserializer dateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(pattern));
                    module.addDeserializer(LocalDateTime.class, dateTimeDeserializer);
                    return Jackson2ObjectMapperBuilder.json().modules(module)
                         .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).build();
        }
     
     
    }

 

 
三、出入参同时处理

前面一和二处理的时候,都是使用了ObjectMapper来处理的,但是两个的来源不一样的,两个同时存在时会优先继承WebMvcConfigurer的。另一个会失效。

究极处理方法:

     
    @Configuration
    public class DateTimeSerializerConfig implements WebMvcConfigurer {
     
        @Value("${spring.jackson.date-format}")
        private String pattern;
     
        /**
         * 时间处理
         * 使用此方法, 以下 spring-boot: jackson时间格式化 配置 将会失效
         * spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
         * spring.jackson.time-zone=GMT+8
         * 原因: 会覆盖 @EnableAutoConfiguration 关于 WebMvcAutoConfiguration 的配置
         * */
        @Override
        public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
            MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
     
            //localDateTime格式化
            JavaTimeModule module = new JavaTimeModule();
            LocalDateTimeDeserializer dateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(pattern));
            LocalDateTimeSerializer dateTimeSerializer = new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));
            module.addDeserializer(LocalDateTime.class, dateTimeDeserializer);
            module.addSerializer(LocalDateTime.class, dateTimeSerializer);
            ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().modules(module)
                    .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).build();
     
            //date时间格式化
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            objectMapper.setDateFormat(new SimpleDateFormat(pattern));
     
            // 设置格式化内容
            converter.setObjectMapper(objectMapper);
            converters.add(0, converter);
     
        }
    }

完美解决入参出参date类型和localDateTime类型。
————————————————
版权声明:本文为CSDN博主「haixin_wu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42343505/article/details/117814346

免责声明:文章转载自《SpringBoot全局时间date和localDateTime格式失效问题记录》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇从入门到实践,快速掌握 Nginx 研发SSH远程管理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

js 中时间格式化的几种方法

1.项目中时间返回值,很过时候为毫秒值,我们需要转换成 能够看懂的时间的格式; 例如: yyyy-MM-dd HH:mm:ss 2.处理方法(处理方法有多种,可以传值到前端处理,也可以后台可以好之后再传递到页面) 方法一:实体类中添加时间转换注解(注意时区问题) /** * 开始时间 */ @JsonFormat(pattern...

linux命令行下修改系统时间、时区

date查看时间以及时区 图a是est时区,和HONGkong时间查了一个小时。 # 保存设置$ sudo mv /etc/localtime /etc/localtime.old # 设置时区 $ sudo ln -sf /usr/share/zoneinfo/Asia/Hong_Kong /etc/localtime # 这里已经改完了 # 更新...

sql把一段时间分割成周,月,季度,年的时间段

--本周 select TO_CHAR(CREATE_DATE ,'yyyy-MM-dd')as NEW_DATE , TO_CHAR(trunc(CREATE_DATE, 'd')+ 1,'yyyy-MM-dd') as START_DATE , TO_CHAR(trunc(CRE...

JAVA定时执行任务,每天定时几点钟执行任务

JAVA定时执行任务,每天定时几点钟执行任务的示例如下: 1.建立TimerManage类,设置时间点,时间点设置的管理类,代码如下: 1 packagecom.pcitc.time; 2 3 importjava.util.Calendar; 4 importjava.util.Date; 5 importjava.util.Timer; 6...

(转)SQL按照日、周、月、年统计数据

写sql语句分别按日,星期,月,季度,年统计销售额 --按日 select sum(consume),day([date]) from consume_record where year([date]) = '2006' group by day([date]) --按周quarter select sum(consume),datename(week,...

odoo 项目经验1

1.在xml中的domain表达式解析:|,&,!以及表示此意义的符号,都是遵从栈的规则(后进先出),右为栈底,所以从最左端的符号开始判断。 2.xml中也可以进行时间计算,比如在一周内的为即将开始等等等。 可参照https://www.cnblogs.com/hellojesson/p/8144474.html <filter strin...