日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

java 时间格式化_彻底解决Spring mvc中时间的转换和序列化等问题

發布時間:2025/3/19 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 时间格式化_彻底解决Spring mvc中时间的转换和序列化等问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

痛點
在使用Spring mvc 進行開發時我們經常遇到前端傳來的某種格式的時間字符串無法用java8的新特性java.time包下的具體類型參數來直接接收。 我們使用含有java.time封裝類型的參數接收也會報反序列化問題,在返回前端帶時間類型的同樣會出現一些格式化的問題。今天我們來徹底解決他們。

建議
其實最科學的建議統一使用時間戳來代表時間。這個是最完美的,避免了前端瀏覽器的兼容性問題,同時也避免了其它一些中間件的序列化/反序列化問題。但是用時間表達可能更清晰語義化。兩種方式各有千秋,如果我們堅持使用java8的時間類庫也不是沒有辦法。下面我們會以java.time.LocalDateTime為例逐一解決這些問題。

局部注解方式
網上有很多文章說該注解是前端指向后端的,也就是前端向后端傳遞時間參數格式化使用的,這沒有錯!但是有一個小問題,該方式只能適用于不涉及反序列化的情況下。也就是以下場景才適用:

@GetMapping("/local")public Map<String, String> data(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime localDateTime) {Map<String, String> map = new HashMap<>(1);map.put("data", localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));return map;}

如果你在下面這個場景使用就不行了:

@Data public class UserInfo {@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime birthday;private String name;private Integer age; }@PostMapping("/user")public Object postData(@RequestBody UserInfo userInfo) {System.out.println("userInfo = " + userInfo);return userInfo;}

原因是Post請求參數在body中,需要反序列化成對象。默認是jackson類庫來進行反序列化,并不觸發@DateTimeFormat注解機制。這時我們就需要使用jackson的格式化注解@JsonFormat。我們將實體類UserInfo改造成下面的就可以了:

@Data public class UserInfo {@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private LocalDateTime birthday;private String name;private Integer age; }

以上兩個注解可以并存,但是一定要清楚各自的使用場景。這里還有一個小細節:格式一定要對應好時間類型。比如yyyy-MM-dd 對應java.time.LocalDate 。想再個性化一些@JsonFormat 可以被@JsonDeserialize和@JsonSerialize 代替。但是它們的using參數需要你自己實現為你對應的時間類型類型。如果@JsonFormat、@JsonDeserialize和@JsonSerialize同時存在@JsonFormat的優先級要更高。

局部處理的好處
局部處理的好處在于八個字:百花齊放,百家爭鳴 ??梢员3侄鄻有浴€性化 。但是局部帶來了一個新的問題 :沒有共同的標準 、不兼容。進而不方便維護。所以有時候基于業務需要我們全局化可以統一管理。下面我們將講解如何進行全局化配置。

全局化化時間格式配置
全局化其實也是基于 @DateTimeFormat 和@JsonFormat 兩種場景來進行配置。對于@DateTimeFormat的場景我們通過實現Spring提供的接口:

DateTimeFormatter :// 時間格式化private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.CHINA);

類型轉換接口:

org.springframework.core.convert.converter.Converter<S,T>
實現:

@Beanpublic Converter<String, LocalDateTime> localDateConverter() {return new Converter<String, LocalDateTime>() {@Overridepublic LocalDateTime convert(String source) {return LocalDateTime.parse(source, FORMATTER);}};}

或者格式化接口:

org.springframework.format.Formatter<T>
實現 :

@Beanpublic Formatter<LocalDateTime> localDateFormatter() {return new Formatter<LocalDateTime>() {@Overridepublic LocalDateTime parse(String text, Locale locale) throws ParseException {return LocalDateTime.parse(text, FORMATTER);}@Overridepublic String print(LocalDateTime object, Locale locale) {return object.format(FORMATTER);}};}

以上兩個接口的實現都要注冊為Spring Bean,配置的時候二者選其一即可,其中S即Source也就是來源,其實就是前端的時間字符串。T即Target也就是目標,代表你需要轉化或者格式化的時間java類型。那么對于時間序列化和反序列化我們進行如下配置就行了(基于默認jackson,以LocalDateTime 為例):

@Beanpublic Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder// 反序列化.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(FORMATTER))// 序列化.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(FORMATTER));}

同樣該jsonMapper自定義構建器要注冊成Spring Bean才行。

全局配置要點

全局配置的一些優缺點上面已經闡述了,這里我還是要啰嗦一下要點避免你踩坑。全局配置跟局部配置一樣。同樣要約定pattern。這就要求我們全局保持一致。我們可以實現多個以上的全局配置來對其他諸如LocalDate、OffsetDateTime 的適配。同時如果我們接入了其它一些需要用到序列化/反序列化的中間件,比如redis、rabbitmq,我們也要注意進行適配。

我這邊給大家整理了一些資料,包括不限于Kafka、Mysql、Tomcat、Docker、Spring、MyBatis、Nginx、Netty、Dubbo、Redis、Netty、Spring cloud、分布式、高并發、性能調優、微服務等架構技術;希望能幫助到大家,也節省大家在網上搜索資料的時間來學習,也可以分享動態給身邊好友一起學習!

領取方式→資料領取方式:私信關鍵詞 【架構資料】即可獲取!

領取方式→資料領取方式:私信關鍵詞 【架構資料】即可獲取!

總結

以上是生活随笔為你收集整理的java 时间格式化_彻底解决Spring mvc中时间的转换和序列化等问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。