LocalDateTime格式化

时间:2025-04-01 07:38:34

说明

  • 环境:SpringBoot3.0.2
  • LocalDateTime本身用法可参考:​​​​​​​​​​​​​​【jdk1.8】LocalDateTime 详细用法,保姆级 - yīyáng - 博客园 ()

Jackson

依赖

默认引入spring-boot-starter-web,即自动引入Jackson;

配置ObjectMapper


import ;
import .;
import .;
import .;
import .;
import .;
import .;
import .;
import ;
import ;
import ;
import ;
import ;
import ;

/**
 * jackson配置
 *
 * @author liaorj
 * @date 2024/03/21
 */
@Configuration
public class JacksonConfig {

    /**
     * jackson配置ObjectMapper对LocalDateTime的序列化、反序列化
     *
     * @return
     */
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();

        // other serializer and deSerializer config ...

        JavaTimeModule javaTimeModule = new JavaTimeModule();
        (, new LocalDateSerializer(("yyyy-MM-dd")));
        (, new LocalDateDeserializer(("yyyy-MM-dd")));

        (, new LocalTimeSerializer(("HH:mm:ss")));
        (, new LocalTimeDeserializer(("HH:mm:ss")));

        (, new LocalDateTimeSerializer(("yyyy-MM-dd HH:mm:ss")));
        (, new LocalDateTimeDeserializer(("yyyy-MM-dd HH:mm:ss")));

        (javaTimeModule);
        return objectMapper;
    }

    /*@Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return jacksonObjectMapperBuilder -> {
            (, new LocalDateSerializer(("yyyy-MM-dd")));
            (, new LocalDateDeserializer(("yyyy-MM-dd")));

            (, new LocalTimeSerializer(("HH:mm:ss")));
            (, new LocalTimeDeserializer(("HH:mm:ss")));

            (, new LocalDateTimeSerializer(("yyyy-MM-dd HH:mm:ss")));
            (, new LocalDateTimeDeserializer(("yyyy-MM-dd HH:mm:ss")));
        };
    }*/
}

 使用ObjectMapper

从spring容器中注入,才能生效,直接new的话本人试过,会报错。

    @Resource
    private ObjectMapper objectMapper;

使用@JsonFormat

  • 直接使用该注解,不依赖上述配置;
  • get出参、post出参和入参使用;
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate date;

    @JsonFormat(pattern = "HH:mm:ss", timezone = "GMT+8")
    private LocalTime startTime;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;

使用@DateTimeFormat

  • 直接使用该注解,不依赖上述配置;
  • get入参使用;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate date;

 配置RabbitMQ消息转换器

  • 依赖上述ObjectMapper配置,否则格式化LocalDateTime字段异常;
  • 在注册RabbitMQ消息转换器时,需传入ObjectMapper对象;
  • 代码中的自动创建消息id设置,与本主题无关;

import ;
import .Jackson2JsonMessageConverter;
import ;
import ;
import ;

/**
 * rabbitmq配置
 *
 * @author liaorj
 * @date 2024/02/26
 */
@Configuration
public class RabbitMQConfig {

    /**
     * AMQP消息转换器,
     * 原本是jdk序列化的,由于消息空间占用较大,且不友好,所以配置该转换器。
     * 发送端和消费端都配置。
     * @return
     */
    @Bean
    public MessageConverter messageConverter(ObjectMapper objectMapper) {
        //定义消息转换器
        Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter(objectMapper);
        //配置自动创建消息id,用于识别不同消息,也可以在业务中基于id判断消息是否重复
        (true);
        return converter;
    }

}

可能遇到的异常 

以上没设置好,可能遇到的异常:

1、LocalDateTime格式化异常:

`` not supported by default: add Module ":jackson-datatype-jsr310"

2、RabbitMQ消息转换异常:

MessageConversionException: Failed to convert Message content]

FastJson

待续...