溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Springboot 中怎么格式化全局時間

發(fā)布時間:2021-08-02 15:59:25 來源:億速云 閱讀:176 作者:Leah 欄目:web開發(fā)

這期內容當中小編將會給大家?guī)碛嘘PSpringboot 中怎么格式化全局時間,文章內容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

時間格式化在項目中使用頻率是非常高的,當我們的 API 接口返回結果,需要對其中某一個 date 字段屬性進行特殊的格式化處理,通常會用到  SimpleDateFormat 工具處理。

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date stationTime = dateFormat.parse(dateFormat.format(PayEndTime()));

可一旦處理的地方較多,不僅 CV 操作頻繁,還產生很多重復臃腫的代碼,而此時如果能將時間格式統一配置,就可以省下更多時間專注于業(yè)務開發(fā)了。

可能很多人覺得統一格式化時間很簡單啊,像下邊這樣配置一下就行了,但事實上這種方式只對 date 類型生效。

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8

而很多項目中用到的時間和日期API 比較混亂, java.util.Date 、 java.util.Calendar 和 java.time  LocalDateTime 都存在,所以全局時間格式化必須要同時兼容性新舊 API。

看看配置全局時間格式化前,接口返回時間字段的格式。

@Data public class OrderDTO {      private LocalDateTime createTime;      private Date updateTime; }

很明顯不符合頁面上的顯示要求(有人抬杠為啥不讓前端解析時間,我只能說睡服代碼比說服人容易得多~)

Springboot 中怎么格式化全局時間


未做任何配置的結果

一、@JsonFormat 注解

@JsonFormat 注解方式嚴格意義上不能叫全局時間格式化,應該叫部分格式化,因為@JsonFormat  注解需要用在實體類的時間字段上,而只有使用相應的實體類,對應的字段才能進行格式化。

@Data public class OrderDTO {      @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd")     private LocalDateTime createTime;      @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")     private Date updateTime; }

字段加上 @JsonFormat 注解后,LocalDateTime 和 Date 時間格式化成功。

Springboot 中怎么格式化全局時間

@JsonFormat 注解格式化

二、@JsonComponent 注解(推薦)

這是我個人比較推薦的一種方式,前邊看到使用 @JsonFormat  注解并不能完全做到全局時間格式化,所以接下來我們使用 @JsonComponent 注解自定義一個全局格式化類,分別對 Date 和 LocalDate  類型做格式化處理。

@JsonComponent public class DateFormatConfig {      @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")     private String pattern;      /**      * @author xiaofu      * @description date 類型全局時間格式化      * @date 2020/8/31 18:22      */     @Bean     public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilder() {          return builder -> {             TimeZone tz = TimeZone.getTimeZone("UTC");             DateFormat df = new SimpleDateFormat(pattern);             df.setTimeZone(tz);             builder.failOnEmptyBeans(false)                     .failOnUnknownProperties(false)                     .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)                     .dateFormat(df);         };     }      /**      * @author xiaofu      * @description LocalDate 類型全局時間格式化      * @date 2020/8/31 18:22      */     @Bean     public LocalDateTimeSerializer localDateTimeDeserializer() {         return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));     }      @Bean     public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {         return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer());     } }

看到 Date 和 LocalDate 兩種時間類型格式化成功,此種方式有效。

Springboot 中怎么格式化全局時間

@JsonComponent 注解處理格式化

但還有個問題,實際開發(fā)中如果我有個字段不想用全局格式化設置的時間樣式,想自定義格式怎么辦?

那就需要和 @JsonFormat 注解配合使用了。

@Data public class OrderDTO {      @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd")     private LocalDateTime createTime;      @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd")     private Date updateTime; }

從結果上我們看到 @JsonFormat 注解的優(yōu)先級比較高,會以 @JsonFormat 注解的時間格式為主。

Springboot 中怎么格式化全局時間

三、@Configuration 注解

這種全局配置的實現方式與上邊的效果是一樣的。

“注意:在使用此種配置后,字段手動配置@JsonFormat 注解將不再生效?!?/p>

  1. @Configuration 

  2. public class DateFormatConfig2 { 

  3.  

  4.     @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}") 

  5.     private String pattern; 

  6.  

  7.     public static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

  8.  

  9.     @Bean 

  10.     @Primary 

  11.     public ObjectMapper serializingObjectMapper() { 

  12.         ObjectMapper objectMapper = new ObjectMapper(); 

  13.         JavaTimeModule javaTimeModule = new JavaTimeModule(); 

  14.         javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer()); 

  15.         javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer()); 

  16.         objectMapper.registerModule(javaTimeModule); 

  17.         return objectMapper; 

  18.     } 

  19.  

  20.     /** 

  21.      * @author xiaofu 

  22.      * @description Date 時間類型裝換 

  23.      * @date 2020/9/1 17:25 

  24.      */ 

  25.     @Component 

  26.     public class DateSerializer extends JsonSerializer<Date> { 

  27.         @Override 

  28.         public void serialize(Date date, JsonGenerator gen, SerializerProvider provider) throws IOException { 

  29.             String formattedDate = dateFormat.format(date); 

  30.             gen.writeString(formattedDate); 

  31.         } 

  32.     } 

  33.  

  34.     /** 

  35.      * @author xiaofu 

  36.      * @description Date 時間類型裝換 

  37.      * @date 2020/9/1 17:25 

  38.      */ 

  39.     @Component 

  40.     public class DateDeserializer extends JsonDeserializer<Date> { 

  41.  

  42.         @Override 

  43.         public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { 

  44.             try { 

  45.                 return dateFormat.parse(jsonParser.getValueAsString()); 

  46.             } catch (ParseException e) { 

  47.                 throw new RuntimeException("Could not parse date", e); 

  48.             } 

  49.         } 

  50.     } 

  51.  

  52.     /** 

  53.      * @author xiaofu 

  54.      * @description LocalDate 時間類型裝換 

  55.      * @date 2020/9/1 17:25 

  56.      */ 

  57.     public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> { 

  58.         @Override 

  59.         public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { 

  60.             gen.writeString(value.format(DateTimeFormatter.ofPattern(pattern))); 

  61.         } 

  62.     } 

  63.  

  64.     /** 

  65.      * @author xiaofu 

  66.      * @description LocalDate 時間類型裝換 

  67.      * @date 2020/9/1 17:25 

  68.      */ 

  69.     public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> { 

  70.         @Override 

  71.         public LocalDateTime deserialize(JsonParser p, DeserializationContext deserializationContext) throws IOException { 

  72.             return LocalDateTime.parse(p.getValueAsString(), DateTimeFormatter.ofPattern(pattern)); 

  73.         } 

  74.     } 


Springboot 中怎么格式化全局時間

上述就是小編為大家分享的Springboot 中怎么格式化全局時間了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI