SpringBoot配置将参数中的字符串日期转换为Data类型

334 阅读1分钟

因为前端接口传递日期参数类型都是字符串,controller接口接收参数类型也可以定义成String

如果想以Date类型接收参数的话,那就要配置一下了

@GetMapping("/queryAll")
public JsonResult queryAll(Date startDate, Date endDate){

}

添加一个 config 类 进行统一转换,这种是全局转换!

import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 请求路径url中的参数进行时间日期类型的转换
 * 字符串->日期Date
 *
 */
@Configuration
public class DateConverterConfig implements Converter<String, Date> {

    private static final List<String> FORMATTER_LIST = new ArrayList<>(4);

    // 只会转换符合这里格式的日期
    static {
        FORMATTER_LIST.add("yyyy-MM");
        FORMATTER_LIST.add("yyyy-MM-dd");
        FORMATTER_LIST.add("yyyy-MM-dd hh:mm");
        FORMATTER_LIST.add("yyyy-MM-dd hh:mm:ss");
    }

    @Override
    public Date convert(String source) {
        String value = source.trim();
        if ("".equals(value)) {
            return null;
        }
        if (source.matches("^\\d{4}-\\d{1,2}$")) {
            return parseDate(source, FORMATTER_LIST.get(0));
        } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) {
            return parseDate(source, FORMATTER_LIST.get(1));
        } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {
            return parseDate(source, FORMATTER_LIST.get(2));
        } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {
            return parseDate(source, FORMATTER_LIST.get(3));
        } else {
            // TODO 日期解析出错
            System.out.println("日期解析出错");
        }
        return null;
    }

    /**
     * 日期转换方法
     *
     * @param dateStr   日期字符串
     * @param formatter 日期格式
     * @return 转换后的Date类型日期
     */
    public Date parseDate(String dateStr, String formatter) {
        Date date = null;
        try {
            DateFormat dateFormat = new SimpleDateFormat(formatter);
            date = dateFormat.parse(dateStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return date;
    }
}

这样 controller 接口就可以使用 Date 类型参数来接收传递过来的字符串类型的时间了。