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);
}
}
通过这种方式,我们可以全局统一处理时间格式,避免在每个时间字段上添加注解,提高代码的可维护性和一致性。
通过以上两种方法,你可以根据项目需求选择合适的解决方案。如果项目中涉及大量的时间字段,推荐使用第二种方法,通过扩展消息转换器来全局处理时间格式问题。