Java global date type conversion configuration

1. Why do you need a custom date type converter?

The controller receives the client request parameters, and the data requested by the client is a string type

The reason why we can use int and double type reception is because of the internal type converter of the framework

SpringMVC is not very good about time type conversion, we need to manually type conversion ourselves

2. Import dependencies

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-core</artifactId>
    <version>5.3.8</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

3. Core configuration class

/**
 * @author zzw
 * @description TODO 自定义时间参数出入参转换类
 * @date 2022-11-15 17:29
 */
@Configuration
public class DateHandlerConfig {
    
    
    
	/**
     * 默认日期时间格式
     */
	private static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
	
    /**
     * 默认日期格式
     */
    private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    
    /**
     * 默认时间格式
     */
    private static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
    
    /**
     * Date转换器
     * 采用hutool的日期解析工具类Dateutil可以匹配任意格式日期字符串
     */
    @Bean
    public Converter<String, Date> dateConverter()
    	return new Converter<String, Date>() {
    
    
    		@Override
            public Date convert(String source) {
    
    
            	return DateUtil.parse(source.trim());
           	}
         };
    }
    
    /**
     * LocalDate转换器
     */
	@Bean
	public Converter<String, LocalDate> localDateConverter() {
    
    
  		return new Converter<String, LocalDate>() {
    
    
      		@Override
      		public LocalDate convert(String source) {
    
    
          		return LocalDate.parse(source, DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT));
      		}
  		};
  
	}
	
	/**
	 * LocalTime转换器
     */
  	@Bean
	public Converter<String, LocalTime> localTimeConverter() {
    
    
 		return new Converter<String, LocalTime>() {
    
    
      		@Override
      		public LocalTime convert(String source) {
    
    
          		return LocalTime.parse(source, DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT));
      		}
  		};
  	}
  	
  	/**
  	 *	LocalDateTime转换器
     */
	@Bean
  	public Converter<String, LocalDateTime> localDateTimeConverter() {
    
    
  		return new Converter<String, LocalDateTime>() {
    
    
      		@Override
   			public LocalDateTime convert(String source) {
    
    
          		return LocalDateTime.parse(source, DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT));
      		}
  		};
  
	}
	
	/**
  	 * Json序列化和反序列化转换器
     */
	@Bean
    public ObjectMapper objectMapper() {
    
    
		ObjectMapper objectMapper = new ObjectMapper();
        //java8日期 Local系列序列化和反序列化模块
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
        javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
        javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
        
        objectMapper.registerModule(new ParameterNamesModule()).registerModule(new Jdk8Module()).registerModule(javaTimeModule);
        
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
        // 忽略json字符串中不识别的属性
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        // 忽略无法转换的对象
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        // PrettyPrinter 格式化输出
        objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
        // NULL不参与序列化
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        // 指定时区
		objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
        /**
         * Date日期类型字符串全局处理, 默认格式为:yyyy-MM-dd HH:mm:ss
         * 局部处理某个Date属性字段接收或返回日期格式yyyy-MM-dd, 可采用@JsonFormat(pattern = "yyyy-MM-dd", timezone="GMT+8")注解标注该属性
  		 */
        objectMapper.setDateFormat(new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT));
		return objectMapper;
	}
}

Guess you like

Origin blog.csdn.net/ITKidKid/article/details/130421992