Bug:时间字段显示有问题

Bug:时间字段显示有问题


文章目录

1、问题

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

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

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

示例代码:

java 复制代码
@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,用于配置日期时间格式。

java 复制代码
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

java 复制代码
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);
    }
}

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


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

相关推荐
云和数据.ChenGuang9 小时前
java常见SSL bug解决方案
java·bug·ssl
cat_with_cat21 小时前
测试:BUG篇
bug·测试
黑客飓风21 小时前
Bug排查日记的技术
bug
Wiktok1 天前
[Wit]CnOCR模型训练全流程简化记录(包括排除BUG)
python·深度学习·bug
玄尺_0071 天前
bug:uniCloud报Business Failed, 参数有误retry invoke error
数据库·bug
程序猿阿伟1 天前
《云原生边缘与AI训练场景:2类高频隐蔽Bug的深度排查与架构修复》
人工智能·云原生·bug
夕阳UPdz1 天前
深入探索 Unity 错误排查过程:从“滚动条问题”到“鼠标悬浮异常”
bug
I still …2 天前
面向OS bug的TypeState分析
bug
摸鱼仙人~2 天前
后端错误处理的艺术:BusinessException 与 ResultUtils 的完美分工
状态模式
上优2 天前
Vue3纯前端同源跨窗口通信移动AGV小车
前端·vue.js·状态模式