在 Spring MVC 中,@DateTimeFormat 注解可将请求参数绑定为 LocalDate,需严格匹配 pattern(如 "yyyy-MM-dd")或使用 iso = DateTimeFormat.ISO.DATE;支持全局 Converter 配置,但优先级低于显式注解;LocalDate 无时区,仅做字符串格式解析。

在 Spring MVC 中,使用 @DateTimeFormat 注解可以将请求参数(如 URL 查询参数或表单字段)自动绑定为 LocalDate 类型,但需注意格式匹配与配置细节,否则会报 400 错误或绑定失败。
确保参数格式与注解 pattern 一致
@DateTimeFormat 必须明确指定日期格式,因为 LocalDate 不含时间信息,不能依赖默认解析。常见写法:
@GetMapping("/events")
public String list(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) {
// ...
}
此时请求必须是:/events?date=2024-05-20。若传 2024/05/20 或 20-05-2024,会因格式不匹配导致绑定失败,返回 400。
支持多种格式时用 @DateTimeFormat 的 iso 属性
如果希望兼容标准 ISO 格式(如 2024-05-20),可直接使用 iso = DateTimeFormat.ISO.DATE:
立即学习“Java免费学习笔记(深入)”;
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date
该方式等价于 pattern = "yyyy-MM-dd",且更语义化;Spring 内部会调用 LocalDate.parse(CharSequence, DateTimeFormatter),使用 DateTimeFormatter.ISO_DATE 解析。
全局配置 LocalDate 解析(可选但推荐)
若多个 Controller 都需处理 LocalDate,可在配置类中注册自定义 Converter,避免每个参数重复加注解:
- 实现
Converter<String, LocalDate>,例如按yyyy-MM-dd解析 - 通过
WebMvcConfigurer.addFormatters()注册到FormattingConversionService - 注册后,即使不加
@DateTimeFormat,LocalDate参数也能自动绑定(前提是格式匹配)
注意:全局 Converter 优先级低于 @DateTimeFormat,即显式注解仍会覆盖全局规则。
注意时区与字符串来源
LocalDate 是无时区的纯日期类型,@DateTimeFormat 解析时不会涉及时区转换。它只对字符串做格式解析,不依赖系统默认时区。但需确保传入字符串本身是合法日期(如 2024-02-30 会抛 DateTimeParseException,触发 400 响应)。
常见错误场景包括:前端未按约定格式提交、Swagger 或 Postman 测试时漏掉引号(如 date=2024-05-20 正确,date=2024-5-20 错误)、JSON 请求体中未配 @JsonFormat(那是 Jackson 的事,和 @DateTimeFormat 无关)。


















