@DateTimeFormat 和 Formatter 都用于在 Spring 中进行 字符串与 Java 类型之间的格式转换,尤其常用于处理日期类型。但它们的用途、灵活性和使用方式有所不同。
🆚 核心区别对比
对比项 |
@DateTimeFormat 注解 |
Formatter 接口 |
---|---|---|
📌 适用范围 |
主要用于日期时间类型(Date、LocalDate 等) |
可用于任何类型(日期、数字、枚举、自定义类等) |
🛠 使用方式 |
注解在字段、参数上 |
实现类并注册到 FormatterRegistry 中 |
📚 灵活性 |
限于一些内置格式(通过 pattern 指定) |
可实现复杂、自定义的解析和格式化逻辑 |
🔄 控制方向 |
控制单个字段的转换 |
控制整个类型的转换 |
🧰 配合场景 |
简单字段,如表单、DTO、Controller 参数 |
更复杂的格式需求或通用数据类型,如手机号、金额等 |
✅ 示例对比
1️⃣ 使用
@DateTimeFormat
public class UserForm {
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate birthDate;
}
适合简单的日期字段绑定,不需要额外代码,快捷方便。
2️⃣ 使用自定义
Formatter
@Component
public class LocalDateFormatter implements Formatter<LocalDate> {
private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@Override
public LocalDate parse(String text, Locale locale) {
return LocalDate.parse(text, formatter);
}
@Override
public String print(LocalDate object, Locale locale) {
return formatter.format(object);
}
}
注册 Formatter:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new LocalDateFormatter());
}
}
适合全局统一格式或更复杂的解析逻辑。
🧠 总结一句话
-
用 @DateTimeFormat 处理简单的日期字段转换就够了;
-
如果需要对某个类型做全局统一的格式控制,或者是自定义非日期类型的转换,请实现 Formatter。