Bug:时间字段显示有问题

Bug:时间字段显示有问题


1、问题

​ 在后端传输时间给前端的时候,发现前端的时间显示有问题。这通常是由于时间格式不一致导致的。以下是一个示例截图,展示了时间显示的问题:

image-20240716225110627

2、解决方法一:添加注解

​ 在每个时间属性上添加注解 @JsonFormat,对日期进行格式化。这种方式需要在每个时间属性上都加上该注解,使用较麻烦,不能全局处理。

示例代码:

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;

虽然这种方法简单直接,但如果项目中有大量的时间字段,这种方法就显得不够优雅和高效。

3、解决方法二:消息转换器

WebMvcConfiguration 中扩展 SpringMVC 的消息转换器,统一对日期类型进行格式处理。这种方法可以全局处理时间格式问题,避免在每个时间字段上添加注解。

自定义对象映射器

首先,我们需要创建一个自定义的对象映射器 JacksonObjectMapper,用于配置日期时间格式。

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

public class JacksonObjectMapper extends ObjectMapper {

    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    public JacksonObjectMapper() {
        super();
        // 收到未知属性时不报异常
        this.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        // 反序列化时,属性不存在的兼容处理
        this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        SimpleModule simpleModule = new SimpleModule()
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

        // 注册功能模块,例如,可以添加自定义序列化器和反序列化器
        this.registerModule(simpleModule);
    }
}
配置消息转换器

接下来,我们需要在 Spring 的配置类中扩展消息转换器,使用自定义的 JacksonObjectMapper

import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    /**
     * 追加自定义转换器
     * @param converters 消息转换器列表
     */
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 获取json数据转换器封装类
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        // 设置自定义的ObjectMapper
        converter.setObjectMapper(new JacksonObjectMapper());
        // 追加进springMvc中,设置优先级别
        converters.add(0, converter);
    }
}

通过这种方式,我们可以全局统一处理时间格式,避免在每个时间字段上添加注解,提高代码的可维护性和一致性。


通过以上两种方法,你可以根据项目需求选择合适的解决方案。如果项目中涉及大量的时间字段,推荐使用第二种方法,通过扩展消息转换器来全局处理时间格式问题。

相关推荐

  1. BUG】vue中@change时间传值丢失问题

    2024-07-17 00:04:03       32 阅读
  2. bug清单问题

    2024-07-17 00:04:03       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 00:04:03       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 00:04:03       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 00:04:03       62 阅读
  4. Python语言-面向对象

    2024-07-17 00:04:03       72 阅读

热门阅读

  1. 坚持日更的意义何在?

    2024-07-17 00:04:03       19 阅读
  2. Android系统中Launcher应用是被谁启动的

    2024-07-17 00:04:03       21 阅读
  3. 智能家居的四种无线技术

    2024-07-17 00:04:03       24 阅读
  4. 定时任务类:使用@Scheduled注解设计定时任务

    2024-07-17 00:04:03       19 阅读
  5. python 语法学习 day 7

    2024-07-17 00:04:03       28 阅读
  6. 搜维尔科技:Varjo XR-4开箱测评,里面都有啥?

    2024-07-17 00:04:03       18 阅读