springboot时间格式转换(前后端时间格式处理)

1.string转成date : 从前端得到的时间格式一般是string字符串,而后台需要date类型进行一些时间范围查询操作,因此DTO类一般是以date类型接受的:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
//string格式转换类
public class JsonStringToDateDeserializer extends JsonDeserializer<Date> {

    /**
     * 时间戳正则
     */
   private static final String TIME_REGEX="[0-9]{13}";
   private static final String SPECIAL_TIME_SIGN = "T";

   @Override
   public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
       String dateStr = jp.getText();
       try {
           if (!Strings.isNullOrEmpty(dateStr)) {
               if (Pattern.compile(TIME_REGEX).matcher(dateStr).matches()) {
                   return new Date(Long.parseLong(dateStr));
               } else {
                   return stringToDate(dateStr);
               }
           }
           return null;
       } catch (ParseException e) {
           throw new RuntimeException(e);
       }
   }
private  Date stringToDate(String str) throws ParseException {
    if(Strings.isNullOrEmpty(str)){
        return null;
    }
    //特殊格式(2018-05-19T08:04:52.000+0000)解决,若有时区问题,@JsonFormat(timezone=“GMT+8”)注解属性
    if(str.indexOf(SPECIAL_TIME_SIGN) != -1){
        str = str.replace(SPECIAL_TIME_SIGN," ").substring(0,str.indexOf("."));
    }
    // 1、yyyy-MM-dd格式时间校验:
    String regex1 = "(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|" +
            "((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|" +
            "((0[48]|[2468][048]|[3579][26])00))-02-29)$";
    //2、yyyy-MM-dd HH:mm:ss格式时间校验:
    String regex2 = "((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|" +
            "((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|" +
            "((0[48]|[2468][048]|[3579][26])00))-02-29))" +
            "\\s([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
    //3、yyyy/MM/dd格式时间校验:
    String regex3 = "(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})\\/(((0[13578]|1[02])\\/(0[1-9]|[12][0-9]|3[01]))|" +
            "((0[469]|11)\\/(0[1-9]|[12][0-9]|30))|(02\\/(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|" +
            "((0[48]|[2468][048]|[3579][26])00))\\/02\\/29)$";
    // 4、yyyy/MM/dd HH:mm:ss格式时间校验:
    String regex4 = "((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})\\/(((0[13578]|1[02])\\/(0[1-9]|[12][0-9]|3[01]))|" +
            "((0[469]|11)\\/(0[1-9]|[12][0-9]|30))|(02\\/(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|" +
            "((0[48]|[2468][048]|[3579][26])00))\\/02\\/29))" +
            "\\s([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
    //5. 2017-12-31T16:00:00.000+0000
    String regex5 = "";

    if(str.matches(regex1)){
        SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
        return format1.parse(str);
    }else if (str.matches(regex2)){
        SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return format2.parse(str);
    }else if (str.matches(regex3)){
        SimpleDateFormat format3 = new SimpleDateFormat("yyyy/MM/dd");
        return format3.parse(str);
    }else if (str.matches(regex4)){
        SimpleDateFormat format4 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        return format4.parse(str);
    }else {
        throw new RuntimeException("传入的日期:"+str+",格式不支持");
    }
}
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.paic.icore.aaas.common.utils.json.JsonStringToDateDeserializer;

//dto

public class PolicyDTO{

private Date insuranceBeginDate;
public Date getInsuranceBeginDate() {
    return insuranceBeginDate;
}

//注解转换的地方
@JsonDeserialize(using = JsonStringToDateDeserializer.class)
public void setInsuranceBeginDate(Date insuranceBeginDate) {
    this.insuranceBeginDate = insuranceBeginDate;
}

}

2.时间date 转long类型 : 后端接受的时间格式一般是date类型封装dto的,如果直接传给前端,会出现

2018-05-19T08:04:52.000+0000这种格式,难以处理,所以通常我们处理成long类型
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.util.Date;

//时间处理类
public class JsonDateToLongSerializer extends JsonSerializer<Date>{

    /**
     *
     * 功能描述: 日期转换(data转换long)
     *
     * @param date
     * @param gen
     * @param serializers
     * @return:
     * @auther: EX-SUMIN001
     * @date: 2019/03/04 19:36
     * @throws IOException
     */
    @Override
    public void serialize(Date date, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        //精确到毫秒,若到秒除1000
        gen.writeNumber(date.getTime());
    }

}

//dto

package com.paic.icore.aaas.api.vo;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.paic.icore.aaas.common.utils.json.JsonDateToLongSerializer;

import java.util.Date;
import java.util.List;

public class RoleInfoVO{
    
/**
 * 创建时间
 */
private Date createdDate;
public Date getCreatedDate() {
    return createdDate;
}
//引用注解地方
@JsonSerialize(using = JsonDateToLongSerializer.class)
public void setCreatedDate(Date createdDate) {
    this.createdDate = createdDate;
}
}

猜你喜欢

转载自blog.csdn.net/qq_25313187/article/details/88166890