默认情况下,没有用 @DateTimeFormat注解的日期和时间字段通过使用 DateFormat.SHORT样式从字符串转换。如果你愿意,你可以通过定义你自己的全局格式来改变这一点。

    要做到这一点,请确保 Spring 不注册默认的格式化器。相反,在以下工具的帮助下手动注册格式化器:

    • org.springframework.format.datetime.standard.DateTimeFormatterRegistrar
    • org.springframework.format.datetime.DateFormatterRegistrar

    例如,下面的 Java 配置注册了一个全局 YYYMMDD 格式:

    1. package cn.mrcode.study.springdocsread.web;
    2. import org.springframework.beans.factory.annotation.Autowired;
    3. import org.springframework.context.annotation.Bean;
    4. import org.springframework.context.annotation.ComponentScan;
    5. import org.springframework.context.annotation.Configuration;
    6. import org.springframework.context.support.ConversionServiceFactoryBean;
    7. import org.springframework.core.convert.support.GenericConversionService;
    8. import org.springframework.format.datetime.DateFormatter;
    9. import org.springframework.format.datetime.DateFormatterRegistrar;
    10. import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar;
    11. import org.springframework.format.number.NumberFormatAnnotationFormatterFactory;
    12. import org.springframework.format.support.DefaultFormattingConversionService;
    13. import org.springframework.format.support.FormattingConversionService;
    14. import java.time.format.DateTimeFormatter;
    15. import javax.annotation.PostConstruct;
    16. /**
    17. * @author mrcode
    18. */
    19. @Configuration
    20. public class AppConfig {
    21. @Bean
    22. public FormattingConversionService conversionService() {
    23. // 使用 DefaultFormattingConversionService 但不注册默认值
    24. DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(false);
    25. // 确保 @NumberFormat 仍被支持
    26. conversionService.addFormatterForFieldAnnotation(new NumberFormatAnnotationFormatterFactory());
    27. //用特定的全局格式注册 JSR-310 日期转换
    28. DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
    29. registrar.setDateFormatter(DateTimeFormatter.ofPattern("yyyyMMdd"));
    30. registrar.registerFormatters(conversionService);
    31. // 用特定的全局格式进行注册日期转换
    32. DateFormatterRegistrar registrar = new DateFormatterRegistrar();
    33. registrar.setFormatter(new DateFormatter("yyyyMMdd"));
    34. registrar.registerFormatters(conversionService);
    35. // 上面可以二选一
    36. return conversionService;
    37. }
    38. }

    如果你喜欢基于 XML 的配置,你可以使用一个 FormattingConversionServiceFactoryBean。下面的例子显示了如何做到这一点:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="
    5. http://www.springframework.org/schema/beans
    6. https://www.springframework.org/schema/beans/spring-beans.xsd>
    7. <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    8. <property name="registerDefaultFormatters" value="false" />
    9. <property name="formatters">
    10. <set>
    11. <bean class="org.springframework.format.number.NumberFormatAnnotationFormatterFactory" />
    12. </set>
    13. </property>
    14. <property name="formatterRegistrars">
    15. <set>
    16. <bean class="org.springframework.format.datetime.standard.DateTimeFormatterRegistrar">
    17. <property name="dateFormatter">
    18. <bean class="org.springframework.format.datetime.standard.DateTimeFormatterFactoryBean">
    19. <property name="pattern" value="yyyyMMdd"/>
    20. </bean>
    21. </property>
    22. </bean>
    23. </set>
    24. </property>
    25. </bean>
    26. </beans>

    注意在 Web 应用程序中配置日期和时间格式时有额外的注意事项。请参阅 WebMVC 转换和格式化WebFlux 转换和格式化