在Spring Boot 中,你可以通过自定义 @DateTimeFormat
来接受多种日期格式。为此,你需要做以下几个步骤:
- 创建自定义的
DateFormatter
类:此类将定义如何解析和格式化日期。 - 配置
ConversionService
或FormatterRegistry
:将自定义的DateFormatter
注册到 Spring 的ConversionService
中。 - 在你的控制器中使用自定义格式:通过
@InitBinder
方法来绑定你自定义的DateFormatter
。
以下是一个详细的示例:
1. 创建自定义 DateFormatter
类
首先,创建一个新的类来定义自定义的 DateFormatter
。
import org.springframework.format.Formatter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class CustomDateFormatter implements Formatter<Date> {
private static final String[] DATE_FORMATS = new String[] {
"yyyy-MM-dd",
"MM/dd/yyyy",
"dd-MM-yyyy"
};
@Override
public Date parse(String text, Locale locale) throws ParseException {
for (String format : DATE_FORMATS) {
try {
return new SimpleDateFormat(format).parse(text);
} catch (ParseException ignored) {
}
}
throw new ParseException("Unparseable date: " + text, -1);
}
@Override
public String print(Date object, Locale locale) {
return new SimpleDateFormat(DATE_FORMATS[0]).format(object);
}
}
2. 配置 ConversionService
或 FormatterRegistry
在你的 Spring 配置类(通常是继承 WebMvcConfigurer
)中注册这个自定义的 DateFormatter
。
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new CustomDateFormatter());
}
}
3. 在控制器中使用自定义格式
你可以通过 @InitBinder
方法来绑定你自定义的 DateFormatter
。
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.addCustomFormatter(new CustomDateFormatter());
}
// Your endpoints here
}
这样配置后,你的 Spring Boot 应用将能够接受多种日期格式。你可以在控制器方法中使用 @DateTimeFormat
注解来指定日期字段。例如:
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Date;
@RestController
public class MyController {
@GetMapping("/date")
public String getDate(@RequestParam @DateTimeFormat Date date) {
return "Parsed date: " + date;
}
}
在这个示例中,@RequestParam
注解会根据你自定义的 DateFormatter
自动解析传入的日期参数。