Springboot中設(shè)置時(shí)間格式問題小結(jié)
1-設(shè)置全局時(shí)間格式
1.Date類型的時(shí)間
對于老項(xiàng)目來說,springboot中許多類使用的是Date類型的時(shí)間,沒有用到LocalDateTime等JDK8時(shí)間類,那么直接在配置文件中設(shè)置json序列化時(shí)間格式即可
# 配置文件中配置 jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8
2.JDK8時(shí)間
如果項(xiàng)目中的時(shí)間采用的是LocalDateTime、LocalDate、LocalTime等JDK8時(shí)間類,Jackson默認(rèn)情況下不支持這些時(shí)間類的序列化,那么我們需要顯式的配置它。
// 方案1 @Configuration public class JacksonConfig { @Bean public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() { Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); // 注冊 JavaTimeModule 以支持 JDK 8 時(shí)間類 JavaTimeModule javaTimeModule = new JavaTimeModule(); // 配置日期時(shí)間格式 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); // 禁用時(shí)間戳格式 return builder; } }
// 方案2 @Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); // 注冊 JavaTimeModule 以支持 JDK 8 時(shí)間類 JavaTimeModule javaTimeModule = new JavaTimeModule(); // 配置日期時(shí)間格式 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); // 禁用時(shí)間戳格式 return objectMapper; } }
注意?。。‘?dāng)你顯式通過配置類進(jìn)行配置的時(shí)候,配置文件中對于Date類型的格式配置以及時(shí)區(qū)通通失效了,這是因?yàn)樽远x的配置會覆蓋Springboot的自動配置,當(dāng)檢測到你自定義配置時(shí),自動配置不會再生效
3.使Date類和JDK8時(shí)間類統(tǒng)統(tǒng)格式化時(shí)間
如果你的項(xiàng)目比較亂,這些類混合在用,那么你需要在顯式配置的時(shí)候捎帶上Date類如何序列化的規(guī)則,如下
@Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); // 設(shè)置全局日期格式(影響 java.util.Date) objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); // 注冊 JavaTimeModule 以支持 JDK 8 時(shí)間類 JavaTimeModule javaTimeModule = new JavaTimeModule(); // 配置日期時(shí)間格式 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); // 禁用時(shí)間戳格式(影響 java.util.Date 和 JDK 8 時(shí)間類) objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); return objectMapper; } }
以上這些配置根據(jù)項(xiàng)目情況選擇合適的序列化/反序列化方案,這些方案適用于json的入?yún)?出參的序列化規(guī)則,也就是說,當(dāng)你的入?yún)⑹莏son格式時(shí),對應(yīng)的時(shí)間只要適用于你規(guī)定的格式,那么jackson將會自動處理
當(dāng)你想自定義某個類中的時(shí)間屬性以特定格式返回的時(shí)候,你可以使用@JsonFormat注解,該注解優(yōu)先級大于項(xiàng)目全局時(shí)間格式
2-關(guān)于@DateTimeFormat注解
@DateTimeFormat 注解主要用于入?yún)r(shí)格式化日期參數(shù),尤其是在處理表單提交或 URL 請求參數(shù)時(shí)。它不會影響出參(即返回給客戶端的 JSON 或其他格式響應(yīng))的日期格式,該注解對Date類和JDK8時(shí)間類都生效
到此這篇關(guān)于Springboot中設(shè)置時(shí)間格式問題小結(jié)的文章就介紹到這了,更多相關(guān)Springboot設(shè)置時(shí)間格式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot @Autowired注入為空的情況解讀
這篇文章主要介紹了SpringBoot @Autowired注入為空的情況解讀,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03SpringBoot如何通過devtools實(shí)現(xiàn)熱部署
這篇文章主要介紹了SpringBoot如何通過devtools實(shí)現(xiàn)熱部署,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11SpringBoot Security整合JWT授權(quán)RestAPI的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot Security整合JWT授權(quán)RestAPI的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11SpringBoot3和ShardingSphere5框架實(shí)現(xiàn)數(shù)據(jù)分庫分表
這篇文章主要介紹了SpringBoot3和ShardingSphere5框架實(shí)現(xiàn)數(shù)據(jù)分庫分表的相關(guān)資料,需要的朋友可以參考下2023-08-08PowerJob的WorkerHealthReporter工作流程源碼解讀
這篇文章主要為大家介紹了PowerJob的WorkerHealthReporter工作流程源碼解讀,2023-12-12