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<Date>
接口,来定义多个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);
}
- 调用和结果
合集:
springboot(2)
分类:
Java
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2018-05-25 springboot~@Valid注解对嵌套类型的校验
2017-05-25 EF架构~TransactionScope与SaveChanges的关系
2017-05-25 LindAgile.Modules模块化的设计
2012-05-25 Linq To Sql模式中自动生成T-SQL增删改操作系列~PropertyChanged事件实现在子类中记录属性的变化,在基类中进行统一处理
2011-05-25 说说面向对象的故事,主人是人类!(二)