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 {
/**
* 时间戳正则
*/
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{
/**
*
* 功能描述: 日期转换(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;
}
}