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

打印 上一主题 下一主题

主题 949|帖子 949|积分 2847

日期类型的参数在从前端通过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对应的格式,它可以进行遍历,并进行最优的格式匹配
代码的实现
  1. /**
  2. * WebMvc配置.
  3. * @author lind
  4. * @date 2023/5/24 23:46
  5. * @since 1.0.0
  6. */
  7. @Configuration
  8. public class WebMvcConfiguration implements WebMvcConfigurer {
  9.         /**
  10.          * 增加GET请求参数中时间类型转换,注意是LocalTime,LocalDate和LocalDateTime,因为你配置的是DateTimeFormatter.
  11.          * <ul>
  12.          * <li>HH:mm:ss -> LocalTime</li>
  13.          * <li>yyyy-MM-dd -> LocalDate</li>
  14.          * <li>yyyy-MM-dd HH:mm:ss -> LocalDateTime</li>
  15.          * </ul>
  16.          * @param registry
  17.          */
  18.         @Override
  19.         public void addFormatters(FormatterRegistry registry) {
  20.                 DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
  21.                 // LocalDate,LocalTime,LocalDateTime格式化
  22.                 registrar.setTimeFormatter(DatePattern.NORM_TIME_FORMATTER);
  23.                 registrar.setDateFormatter(DatePattern.NORM_DATE_FORMATTER);
  24.                 registrar.setDateTimeFormatter(DatePattern.NORM_DATETIME_FORMATTER);
  25.                 registrar.registerFormatters(registry);
  26.                 // java.util.Date日期格式化
  27.                 registry.addFormatter(new CompositeFormatter());
  28.         }
  29.         /**
  30.          * java.util.Date日期格式化.
  31.          */
  32.         private static class CompositeFormatter implements Formatter<Date> {
  33.                 private final List<Formatter<Date>> formatters = Arrays.asList(new DateFormatter("yyyy-MM-dd HH:mm:ss"),
  34.                                 new DateFormatter("yyyy-MM-dd"), new DateFormatter("HH:mm:ss"));
  35.                 @Override
  36.                 public Date parse(String text, Locale locale) throws ParseException {
  37.                         for (Formatter<Date> formatter : formatters) {
  38.                                 try {
  39.                                         return formatter.parse(text, locale);
  40.                                 }
  41.                                 catch (ParseException ignored) {
  42.                                 }
  43.                         }
  44.                         throw new ParseException("Unable to parse date: " + text, 0);
  45.                 }
  46.                 @Override
  47.                 public String print(Date date, Locale locale) {
  48.                         return formatters.get(0).print(date, locale);
  49.                 }
  50.         }
  51. }
复制代码
测试代码与截图


  • 代码
  1.     @GetMapping("print")
  2.         public ResponseEntity print(@RequestParam LocalDateTime date, @RequestParam Date simple) {
  3.                 Map<String, Object> result = new HashMap<>();
  4.                 result.put("time", date);
  5.                 result.put("simple", simple);
  6.                 return ResponseEntity.ok(result);
  7.         }
复制代码

  • 调用和结果


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表