SpringBoot pass parameter setting global Timestamp and Date date conversion class

1. Set global String conversion to Timestamp conversion class

import org.apache.commons.lang.StringUtils;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import java.sql.Timestamp;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.regex.Pattern;

@Component
public  class  StringToTimestampConverter  implements Converter <String, Timestamp> { // <String, Timestamp> here means conversion from string to timestamp

    static final String YYYY_MM_DD_HH_MM_SS_SSS = "yyyy-MM-dd HH:mm:ss.SSS";
    static final String REG_YYYY_MM_DD_HH_MM_SS_SSS = "[0-9]{4}[-]{1}[0-9]{2}[-]{1}[0-9]{2}[ ]{1}[0-9]{2}[:]{1}[0-9]{2}[:]{1}[0-9]{2}[.]{1}[0-9]{3}";

    static final String YYYY_MM_DD_HH_MM_SS_S = "yyyy-MM-dd HH:mm:ss.S";
    static final String REG_YYYY_MM_DD_HH_MM_SS_S = "[0-9]{4}[-]{1}[0-9]{2}[-]{1}[0-9]{2}[ ]{1}[0-9]{2}[:]{1}[0-9]{2}[:]{1}[0-9]{2}[.]{1}[0-9]{1}";

    static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    static final String REG_YYYY_MM_DD_HH_MM_SS = "[0-9]{4}[-]{1}[0-9]{2}[-]{1}[0-9]{2}[ ]{1}[0-9]{2}[:]{1}[0-9]{2}[:]{1}[0-9]{2}";

    static final String YYYY_MM_DD = "yyyy-MM-dd";
    static final String REG_YYYY_MM_DD = "[0-9]{4}[-]{1}[0-9]{2}[-]{1}[0-9]{2}";
    static final String REG_NUMBER = "[0-9]{1,}";

    @Override
    public Timestamp convert(String timeStr) {
        if(StringUtils.isBlank(timeStr)) {
            return null;
        }
        timeStr = timeStr.trim();

        try {
            DateTimeFormatter formatter;
            if(Pattern.matches(StringToTimestampConverter.REG_YYYY_MM_DD_HH_MM_SS_SSS, timeStr)){
                formatter = DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS_SSS);
            } else if(Pattern.matches(StringToTimestampConverter.REG_YYYY_MM_DD_HH_MM_SS_S, timeStr)){
                formatter = DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS_S);
            } else if(Pattern.matches(StringToTimestampConverter.REG_YYYY_MM_DD_HH_MM_SS, timeStr)) {
                formatter = DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS);
            } else if(Pattern.matches(StringToTimestampConverter.REG_YYYY_MM_DD, timeStr)) {
                formatter = DateTimeFormatter.ofPattern(YYYY_MM_DD);
                LocalDate localDate = LocalDate.parse(timeStr, formatter);
                Instant instant = localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
                Timestamp timestamp = Timestamp.from(instant);
                return timestamp;
            } else if(Pattern.matches(StringToTimestampConverter.REG_NUMBER, timeStr)) {
                Long lDate = new Long(timeStr);
                return new Timestamp(lDate);
            } else {
                throw new RuntimeException(String.format("parser %s to Date fail", timeStr));
            }
                LocalDateTime localDateTime = LocalDateTime.parse(timeStr, formatter);
                Timestamp timestamp = Timestamp.valueOf(localDateTime);
                return timestamp;
        } catch (Exception e) {
            throw new RuntimeException(String.format("parser %s to Date fail", timeStr));
        }
    }


}

 

2. Set the global String conversion to Date conversion class

import org.apache.commons.lang.StringUtils;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import java.sql.Timestamp;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.regex.Pattern;

@Component
public  class  StringToUtilDateConverter  implements Converter <String, Date> { // <String, Date> here means conversion from string to Date

    static final String YYYY_MM_DD = "yyyy-MM-dd";
    static final String REG_YYYY_MM_DD = "[0-9]{4}[-]{1}[0-9]{2}[-]{1}[0-9]{2}";
    static final String REG_NUMBER = "[0-9]{1,}";

    @Override
    public Date convert(String timeStr) {
        if(StringUtils.isBlank(timeStr)) {
            return null;
        }
        timeStr = timeStr.trim();

        try {
            DateTimeFormatter formatter;
            if(Pattern.matches(StringToUtilDateConverter.REG_YYYY_MM_DD, timeStr)) {
                formatter = DateTimeFormatter.ofPattern(YYYY_MM_DD);
            } else if(Pattern.matches(StringToUtilDateConverter.REG_NUMBER, timeStr)) {
                Long lDate = new Long(timeStr);
                return new Timestamp(lDate);
            } else {
                throw new RuntimeException(String.format("parser %s to Date fail", timeStr));
            }
                LocalDate localDate = LocalDate.parse(timeStr, formatter);
                Instant instant = localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
                Date date = Date.from(instant);
                return date;
        } catch (Exception e) {
            throw new RuntimeException(String.format("parser %s to Date fail", timeStr));
        }
    }


}

 

3. Important! The last step, register the conversion class to the spring container

import com.myapp.util.StringToTimestampConverter;
import com.myapp.util.StringToUtilDateConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.support.GenericConversionService;
import org.springframework.web.bind.support.ConfigurableWebBindingInitializer;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;

import javax.annotation.PostConstruct;

@Configuration
public  class MyappConfigTimestampConverter {
    @Autowired
    private RequestMappingHandlerAdapter handlerAdapter;
    @Autowired
    private StringToTimestampConverter stringToTimestampConverter;
    @Autowired
    private StringToUtilDateConverter stringToUtilDateConverter;

    /**
     * converts a string to java.sql.Timestamp and other Date
     */
    @PostConstruct
    public void initEditableAvlidation() {

        ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer)handlerAdapter.getWebBindingInitializer();
        if(initializer.getConversionService()!=null) {
            GenericConversionService genericConversionService = (GenericConversionService)initializer.getConversionService();
            genericConversionService.addConverter(stringToTimestampConverter);
            genericConversionService.addConverter(stringToUtilDateConverter);
        }

    }
}

 

end.

Guess you like

Origin www.cnblogs.com/zhuwenjoyce/p/12692914.html