1.接收的时间格式
先看一下时间格式:如下
“/Date(1684933117770-0700)/” ,
“/Date(1684933117770)/”
2.时间格式说明
这两种时间格式都是Microsoft JSON日期格式(Microsoft JSON Date format)的变种,也被称为.NET JSON日期格式(.NET JSON Date format)。
第一种时间格式:“/Date(1684933117770-0700)/”
这种格式包含了日期的毫秒数和时区偏移量。具体结构如下:
- “/Date(”:日期格式的开始标记。
- 1684933117770:表示日期的毫秒数
- -0700:表示时区偏移量的部分,以小时为单位。在这个例子中,表示时区偏移量为-7小时。
- “)/”:日期格式的结束标记。 例如,对于毫秒数为1684933117770,时区偏移量为-7小时的时间,可以解释为1970-01-19T11:31:51.777Z-0700。
第二种时间格式:“/Date(1684933117770)/”
这种格式只包含日期的毫秒数,没有时区偏移量。具体结构如下:
- “/Date(”:日期格式的开始标记。
- 1684933117770:表示日期的毫秒数。
- “)/”:日期格式的结束标记。 例如,对于毫秒数为1684933117770的时间,可以解释为
1970-01-19T11:31:51.777Z。
这两种格式在.NET平台中常用,用于表示日期和时间的序列化和反序列化。在Java中,可以使用自定义的日期反序列化器(如提供的DateDeserializer类)来解析这种格式的时间字符串,并将其转换为Java的Date对象或其他适当的类型。
使用Jackson 时怎么自定义反序列化工具呢?
用如下代码可以实现:
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.newegg.logistics.tis.common.constant.ZoneConstant;
import lombok.SneakyThrows;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
/**
* @author Husu.Y.Hu
* @date 2023/5/30
*/
public class MicrosoftDateDeserializer extends JsonDeserializer<Date> {
private static final String OPEN_PARENTHESIS = "(";
private static final String CLOSE_PARENTHESIS = ")";
private static final String MINUS = "-";
private static final String PLUS = "+";
@SneakyThrows
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
String originalDateStr = jsonParser.getText();
int start = originalDateStr.indexOf(OPEN_PARENTHESIS) + 1;
int end = originalDateStr.indexOf(CLOSE_PARENTHESIS);
String dateStr = originalDateStr.substring(start, end);
if (dateStr.contains(MINUS) || dateStr.contains(PLUS)) {
int offsetIndex = dateStr.lastIndexOf(MINUS);
if (offsetIndex == -1) {
offsetIndex = dateStr.lastIndexOf(PLUS);
}
long milliseconds = Long.parseLong(dateStr.substring(0, offsetIndex));
Date date = new Date(milliseconds);
String offset = dateStr.substring(offsetIndex);
TimeZone timeZone = TimeZone.getTimeZone("GMT" + offset);
SimpleDateFormat dateFormat = new SimpleDateFormat(ZoneConstant.ISO_8601);
dateFormat.setTimeZone(timeZone);
String formattedDate = dateFormat.format(date);
return dateFormat.parse(formattedDate);
} else {
long milliseconds = Long.parseLong(dateStr);
return new Date(milliseconds);
}
}
}
3.使用
@JsonDeserialize(using = MicrosoftDateDeserializer.class)
private Date createTime;
只需要在需要接收的字段上加上该注解就ok奥.
需要注意的是,pom中要引入jackson ,具体怎么引入,其他博主也可写的很详细啦。我就不赘述啦。