使用 Spring MVC 時,很多業務場景下 Controller 需要接收日期時間參數。一個簡單的做法是使用 String 接收日期時間字符串(例如:2020-01-29),然后在代碼中將其轉換成 Java 8 的日期時間類型或 java.util.Date 類型。這種方法雖然簡單,但是當有多個 Controller 接收日期參數時,這種方法就顯得有些繁瑣了。
另一個做法是使用以下兩個 Spring 提供的注解,可以很好地滿足上述需求。
org.springframework.web.bind.annotation.RequestParam
org.springframework.format.annotation.DateTimeFormat
RequestParam 比較常見,用於標注 Controller 中方法的參數;DateTimeFormat 用於聲明一個對象屬性或者方法參數會被格式化為日期或時間。兩個注解結合使用時,Spring 會調用 FormattingConversionService.convert(Object, TypeDescriptor, TypeDescriptor) 將日期時間字符串轉換成日期時間類型。
示例如下:
一、將 2020-01-29 轉換成 LocalDate;
二、將 12:25:30 轉換成 LocalTime;
三、將 2020-01-29 12:25:30 轉換成 LocalDateTime。
1 @RestController 2 @RequestMapping("/test") 3 public class TestController { 4 5 @GetMapping("/date") 6 public LocalDate showDate(@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date) { 7 return date; 8 } 9 10 @GetMapping("/time") 11 public LocalTime showTime(@RequestParam @DateTimeFormat(pattern = "HH:mm:ss") LocalTime time) { 12 return time; 13 } 14 @GetMapping("/dateTime") 15 public LocalDateTime showDateTime(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime dateTime) { 16 return dateTime; 17 } 18 }
第 1 個方法中的使用的是 iso = DateTimeFormat.ISO.DATE,第 3 個方法中使用的是 pattern = "yyyy-MM-dd HH:mm:ss"。因為第 1 個方法接收的日期字符串符合 ISO 的日期格式 yyyy-MM-dd,所以直接使用使用 DateTimeFormat.ISO 枚舉類中定義好的日期格式。第 3 個方法接收的日期時間字符串不符合 ISO 的日期時間格式 yyyy-MM-dd'T'HH:mm:ss.SSSXXX,所以使用 pattern 指定自定義的日期時間格式。第 2 個方法與第 3 個方法原理相同。
對於任何日期時間格式均可使用 pattern 來指定,所以第 1 個方法中也可以使用 pattern = "yyyy-MM-dd" 指定。