目錄
- 1-設置全局時間格式
- 1.Date類型的時間
- 2.JDK8時間
- 3.使Date類和JDK8時間類統統格式化時間
- 2-關于@DateTimeFormat注解
1-設置全局時間格式
1.Date類型的時間
對于老項目來說,springboot中許多類使用的是Date類型的時間,沒有用到LocalDateTime等JDK8時間類,那么直接在配置文件中設置json序列化時間格式即可
# 配置文件中配置jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8
2.JDK8時間
如果項目中的時間采用的是LocalDateTime、LocalDate、LocalTime等JDK8時間類,Jackson默認情況下不支持這些時間類的序列化,那么我們需要顯式的配置它。
// 方案1
@Configuration
public class JacksonConfig {@Beanpublic 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;}
}
// 方案2
@Configuration
public class JacksonConfig {@Beanpublic 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類如何序列化的規則,如下
@Configuration
public class JacksonConfig {@Beanpublic 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時間類都生效