自由的羽毛 发表于 2023-5-25 09:15:47

springboot~统一处理日期请求参数java.utils.Date和java.time.LocalDate

日期类型的参数在从前端通过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
*/
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

        /**
       * 增加GET请求参数中时间类型转换,注意是LocalTime,LocalDate和LocalDateTime,因为你配置的是DateTimeFormatter.
       * <ul>
       * <li>HH:mm:ss -> LocalTime</li>
       * <li>yyyy-MM-dd -> LocalDate</li>
       * <li>yyyy-MM-dd HH:mm:ss -> LocalDateTime</li>
       * </ul>
       * @param registry
       */
        @Override
        public 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<Date> {

                private final List<Formatter<Date>> formatters = Arrays.asList(new DateFormatter("yyyy-MM-dd HH:mm:ss"),
                                new DateFormatter("yyyy-MM-dd"), new DateFormatter("HH:mm:ss"));

                @Override
                public Date parse(String text, Locale locale) throws ParseException {
                        for (Formatter<Date> formatter : formatters) {
                                try {
                                        return formatter.parse(text, locale);
                                }
                                catch (ParseException ignored) {
                                }
                        }
                        throw new ParseException("Unable to parse date: " + text, 0);
                }

                @Override
                public 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<String, Object> result = new HashMap<>();
                result.put("time", date);
                result.put("simple", simple);
                return ResponseEntity.ok(result);
        }

[*]调用和结果
https://img2023.cnblogs.com/blog/118538/202305/118538-20230525092906715-1576008872.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: springboot~统一处理日期请求参数java.utils.Date和java.time.LocalDate