(资料图)
日期类型的参数在从前端通过url参数传递到后端时,它会被进行格式化,如果格式化失败会出现400的错误,像日期格式默认会使用yyyy/MM/dd的格式,如果希望自己去个性化配置,我们可以通过实现WebMvcConfigurer接口的addFormatters方法来完成。
java.time.LocalDate统一处理
DateTimeFormatterRegistrar
实例的setTimeFormatter
,setDateFormatter
,setDateTimeFormatter
可以很方便的指定LocalDate这些类型的格式- 通过定义
DateFormatter
对象,可以声明java.util.Date类型的格式,但默认的,你只能定义一个java.util.Date对应的格式,多个的话,被会覆盖 - 通过实现
org.springframework.format.Formatter
接口,来定义多个java.util.Date对应的格式,它可以进行遍历,并进行最优的格式匹配
代码的实现
/** * WebMvc配置. * @author lind * @date 2023/5/24 23:46 * @since 1.0.0 */@Configurationpublic class WebMvcConfiguration implements WebMvcConfigurer {/** * 增加GET请求参数中时间类型转换,注意是LocalTime,LocalDate和LocalDateTime,因为你配置的是DateTimeFormatter. * * - HH:mm:ss -> LocalTime
* - yyyy-MM-dd -> LocalDate
* - yyyy-MM-dd HH:mm:ss -> LocalDateTime
*
* @param registry */@Overridepublic void addFormatters(FormatterRegistry registry) {DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();// LocalDate,LocalTime,LocalDateTime格式化registrar.setTimeFormatter(DatePattern.NORM_TIME_FORMATTER);registrar.setDateFormatter(DatePattern.NORM_DATE_FORMATTER);registrar.setDateTimeFormatter(DatePattern.NORM_DATETIME_FORMATTER);registrar.registerFormatters(registry);// java.util.Date日期格式化registry.addFormatter(new CompositeFormatter());}/** * java.util.Date日期格式化. */private static class CompositeFormatter implements Formatter {private final List> formatters = Arrays.asList(new DateFormatter("yyyy-MM-dd HH:mm:ss"),new DateFormatter("yyyy-MM-dd"), new DateFormatter("HH:mm:ss"));@Overridepublic Date parse(String text, Locale locale) throws ParseException {for (Formatter formatter : formatters) {try {return formatter.parse(text, locale);}catch (ParseException ignored) {}}throw new ParseException("Unable to parse date: " + text, 0);}@Overridepublic String print(Date date, Locale locale) {return formatters.get(0).print(date, locale);}}}
测试代码与截图
- 代码
@GetMapping("print")public ResponseEntity print(@RequestParam LocalDateTime date, @RequestParam Date simple) {Map result = new HashMap<>();result.put("time", date);result.put("simple", simple);return ResponseEntity.ok(result);}
- 调用和结果