目录
1-设置全局时间格式
1.Date类型的时间
对于老项目来说,springboot中许多类使用的是Date类型的时间,没有用到LocalDateTime等JDK8时间类,那么直接在配置文件中设置json序列化时间格式即可
xml
# 配置文件中配置
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
2.JDK8时间
如果项目中的时间采用的是LocalDateTime、LocalDate、LocalTime等JDK8时间类,Jackson默认情况下不支持这些时间类的序列化,那么我们需要显式的配置它。
java
// 方案1
@Configuration
public class JacksonConfig {
@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
// 注册 JavaTimeModule 以支持 JDK 8 时间类
JavaTimeModule javaTimeModule = new JavaTimeModule();
// 配置日期时间格式
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 自定义 LocalDateTime 序列化器和反序列化器
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter));
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter));
// 自定义 LocalDate 序列化器和反序列化器(如果需要)
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
// 自定义 LocalTime 序列化器和反序列化器(如果需要)
javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
builder.modules(javaTimeModule);
// 其他全局配置
builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // 禁用时间戳格式
return builder;
}
}
java
// 方案2
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
// 注册 JavaTimeModule 以支持 JDK 8 时间类
JavaTimeModule javaTimeModule = new JavaTimeModule();
// 配置日期时间格式
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 自定义 LocalDateTime 序列化器和反序列化器
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter));
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter));
// 自定义 LocalDate 序列化器和反序列化器(如果需要)
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
// 自定义 LocalTime 序列化器和反序列化器(如果需要)
javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
objectMapper.registerModule(javaTimeModule);
// 其他全局配置
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // 禁用时间戳格式
return objectMapper;
}
}
注意!!!当你显式通过配置类进行配置的时候,配置文件中对于Date类型的格式配置以及时区通通失效了,这是因为自定义的配置会覆盖Springboot的自动配置,当检测到你自定义配置时,自动配置不会再生效
3.使Date类和JDK8时间类统统格式化时间
如果你的项目比较乱,这些类混合在用,那么你需要在显式配置的时候捎带上Date类如何序列化的规则,如下
java
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
// 设置全局日期格式(影响 java.util.Date)
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
// 注册 JavaTimeModule 以支持 JDK 8 时间类
JavaTimeModule javaTimeModule = new JavaTimeModule();
// 配置日期时间格式
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 自定义 LocalDateTime 序列化器和反序列化器
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter));
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter));
// 自定义 LocalDate 序列化器和反序列化器
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
// 自定义 LocalTime 序列化器和反序列化器
javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
objectMapper.registerModule(javaTimeModule);
// 禁用时间戳格式(影响 java.util.Date 和 JDK 8 时间类)
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return objectMapper;
}
}
以上这些配置根据项目情况选择合适的序列化/反序列化方案,这些方案适用于json的入参/出参的序列化规则,也就是说,当你的入参是json格式时,对应的时间只要适用于你规定的格式,那么jackson将会自动处理
当你想自定义某个类中的时间属性以特定格式返回的时候,你可以使用@JsonFormat注解,该注解优先级大于项目全局时间格式
2-关于@DateTimeFormat注解
@DateTimeFormat 注解主要用于入参时格式化日期参数,尤其是在处理表单提交或 URL 请求参数时。它不会影响出参(即返回给客户端的 JSON 或其他格式响应)的日期格式,该注解对Date类和JDK8时间类都生效