Springboot中設(shè)置時(shí)間格式問題小結(jié)
1-設(shè)置全局時(shí)間格式
1.Date類型的時(shí)間
對(duì)于老項(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();
// 注冊(cè) 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();
// 注冊(cè) 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í)候,配置文件中對(duì)于Date類型的格式配置以及時(shí)區(qū)通通失效了,這是因?yàn)樽远x的配置會(huì)覆蓋Springboot的自動(dòng)配置,當(dāng)檢測(cè)到你自定義配置時(shí),自動(dòng)配置不會(huì)再生效
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"));
// 注冊(cè) 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í),對(duì)應(yīng)的時(shí)間只要適用于你規(guī)定的格式,那么jackson將會(huì)自動(dòng)處理
當(dāng)你想自定義某個(gè)類中的時(shí)間屬性以特定格式返回的時(shí)候,你可以使用@JsonFormat注解,該注解優(yōu)先級(jí)大于項(xiàng)目全局時(shí)間格式
2-關(guān)于@DateTimeFormat注解
@DateTimeFormat 注解主要用于入?yún)r(shí)格式化日期參數(shù),尤其是在處理表單提交或 URL 請(qǐng)求參數(shù)時(shí)。它不會(huì)影響出參(即返回給客戶端的 JSON 或其他格式響應(yīng))的日期格式,該注解對(duì)Date類和JDK8時(shí)間類都生效
到此這篇關(guān)于Springboot中設(shè)置時(shí)間格式問題小結(jié)的文章就介紹到這了,更多相關(guān)Springboot設(shè)置時(shí)間格式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MybatisPlus搭建項(xiàng)目環(huán)境及分頁(yè)插件
Mybatis-Plus(簡(jiǎn)稱MP)是一個(gè)Mybatis的增強(qiáng)工具,在Mybatis的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于MybatisPlus搭建項(xiàng)目環(huán)境及分頁(yè)插件的相關(guān)資料,需要的朋友可以參考下2022-11-11
Java中關(guān)于ThreadLocal的隱式引用詳解
這篇文章主要介紹了Java中關(guān)于ThreadLocal的隱式引用,從線程的角度看,每個(gè)線程都保持一個(gè)對(duì)其線程局部變量副本的隱式引用,只要線程是活動(dòng)的,ThreadLocal實(shí)例就是可訪問的,下面我們來具體看看2024-03-03

