添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

写Java实体类遇到日期类型的往往要加上日期格式化注解,浪费不必要的时间还麻烦,总感觉不够优雅、体面

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

解决方案:

Date类型的可以在yml中全局配置、指定的日期格式与类型

jackson:
    default-property-inclusion: non_null
    date-format: "yyyy-MM-dd HH:mm:ss"
    time-zone: "GMT+8"

但是 jackson 不能改变Java 8 的日期类,例如LocalDateTime。此时我们可以创建配置类单独给LocalDateTime转换日期格式如下:

@Configuration
public class LocalDateTimeSerializerConfig {
    @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
    private String pattern;
    @Bean
    public LocalDateTimeSerializer localDateTimeDeserializer() {
        return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer());

后来在使用rabbitMq的过程中也遇到一个LocalDate序列化的错误:

Java 8 date/time type `java.time.LocalDateTime` not supported by default:

详见       解决rabbitmq接收消息中Java8日期类型的序列化问题

把实体类用 @RestController 往前端返回的时候,Date 数据会默认使用 ISO 8601 格式返回,也就是如下格式: 其中尾部的 +00:00 指时区,这种方式返回前端不太友好,可以在配置文件内配置一下: spring: jackson: # 格式化返回时间 yyyy-MM-dd HH:mm:ss date-format: yyyy-MM-dd HH:mm:ss
@Transient @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty(value = "createTime", name = "开票时间") private Date createTime; @Configuration public class LocalDateTimeSerializerConfig { @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}") private String pattern; public LocalDateTimeSerializer localDateTimeDeserializer() { LocalTime:只含时分秒的时间对象 LocalDateTime:同时含有年月日时分秒的日期对象三者的对比: 关于三者的详解:详情可见博客点击可跳转@JsonFormat 用来表示json序列化的一种格式或者类型,主要有下面几个常用的属性 shape: 表示序列化后的一种类型,默认为JsonFormat.Shape.ANYp
@Configuration public class LocalDateTimeConverter implements Converter<String, LocalDateTime> { @Override public LocalDateTime convert(String source) { if (StringUtils.isEmpty(source)) { return null; return LocalDateTime.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); 然后,将该类注入到SpringBoot的配置中: @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private LocalDateTimeConverter localDateTimeConverter; @Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(localDateTimeConverter); 现在,当我们在Controller中接收LocalDateTime类型的参数时,SpringBoot会自动将参数转换为指定格式的LocalDateTime类型。例如: @GetMapping("/test") public String test(LocalDateTime date) { // do something with date return "success"; 当我们请求/test?date=2022-02-22%2012:12:12时,date参数将会被自动转换为LocalDateTime类型,其值为2022-02-22T12:12:12。 rabbitmq:Java 8 date/time type `java.time.LocalDateTime` not supported by default:日期序列化问题 rabbitmq:Java 8 date/time type `java.time.LocalDateTime` not supported by default:日期序列化问题 适配器模式-常用的设计模式