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);
    }
}

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


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

相关推荐
小木木爸9 小时前
若依框架图片预览异常:Content-Type变成application/octet-stream,前端后端谁的锅?
前端·状态模式
Leo6553510 小时前
动态 SQL(行+列) + 动态表头(前端+EasyPoi) = 完整透视报表系统
前端·sql·状态模式
初圣魔门首席弟子11 小时前
bug2026.03.24
c++·bug
无心水11 小时前
【时间利器】4、JavaScript时间处理全解:Date/moment/dayjs/Temporal
开发语言·前端·javascript·状态模式·openclaw·date/moment·dayjs/temporal
兄弟加油,别颓废了。11 小时前
解题步骤11
状态模式
callJJ11 小时前
Ant Design Table 批量操作踩坑总结 —— 从三个 Bug 看前端表格开发的共性问题
java·前端·经验分享·bug·管理系统
cyforkk12 小时前
警惕生产环境中的“日志炸弹”:Spring MVC 异常处理最佳实践
spring·mvc·状态模式
南啸天13 小时前
Prompt—— 被 “高端术语” 包装的基础操作
prompt·状态模式
小茴香3531 天前
图片懒加载
状态模式
ZWZhangYu1 天前
【Gradio系列】使用 Gradio 快速构建对话式 AI 应用
人工智能·状态模式