项目中老接口是返回的时间戳给前端,新项目使用了fastjson2需要兼容老的接口,然而在fastjson2中默认时间格式化为 yyyy-MM-dd HH:mm:ss.SSS
。
网上搜索半天,基本上都是 fastjson2 刚发布那会的入门介绍,最后还是得自己翻源码。
从源码里找到这么一段代码。
if (dateFormat != null && !dateFormat.isEmpty()) {
boolean dateFormatMillis = false, dateFormatISO8601 = false, dateFormatUnixTime = false, formatHasDay = false, formatHasHour = false, formatyyyyMMddhhmmss19 = false;
switch (dateFormat) {
case "millis":
dateFormatMillis = true;
break;
case "iso8601":
dateFormatMillis = false;
dateFormatISO8601 = true;
break;
case "unixtime":
dateFormatMillis = false;
dateFormatUnixTime = true;
break;
case "yyyy-MM-ddTHH:mm:ss":
dateFormat = "yyyy-MM-dd'T'HH:mm:ss";
formatHasDay = true;
formatHasHour = true;
break;
case "yyyy-MM-dd HH:mm:ss":
formatyyyyMMddhhmmss19 = true;
formatHasDay = true;
formatHasHour = true;
break;
default:
dateFormatMillis = false;
formatHasDay = dateFormat.indexOf("d") != -1;
formatHasHour = dateFormat.indexOf("H") != -1;
break;
}
this.dateFormatMillis = dateFormatMillis;
this.dateFormatISO8601 = dateFormatISO8601;
this.dateFormatUnixTime = dateFormatUnixTime;
this.formatHasDay = formatHasDay;
this.formatHasHour = formatHasHour;
this.formatyyyyMMddhhmmss19 = formatyyyyMMddhhmmss19;
}
推测应该使用"millis"或者"unixtime"就能到达我们的目的。
接下来开始测试。
测试Bean类
import com.alibaba.fastjson2.annotation.JSONField;
import java.util.Date;
public class Bean {
@JSONField(format = "millis")
private Date millisDate;
@JSONField(format = "unixtime")
private Date unixTimeDate;
@JSONField(format = "iso8601")
private Date iso8601Date;
public Date getMillisDate() {
return millisDate;
}
public void setMillisDate(Date millisDate) {
this.millisDate = millisDate;
}
public Date getUnixTimeDate() {
return unixTimeDate;
}
public void setUnixTimeDate(Date unixTimeDate) {
this.unixTimeDate = unixTimeDate;
}
public Date getIso8601Date() {
return iso8601Date;
}
public void setIso8601Date(Date iso8601Date) {
this.iso8601Date = iso8601Date;
}
}
public class DemoTest {
public static void main(String[] args) {
Bean bean = new Bean();
Date now = new Date();
bean.setUnixTimeDate(now);
bean.setIso8601Date(now);
bean.setMillisDate(now);
System.out.println(JSON.toJSONString(bean));
}
}
运行结果
{"iso8601Date":"2022-11-06T19:25:52.205+08:00","millisDate":1667733952205,"unixTimeDate":1667733952}
结果证明我们猜的没错。
fastjson2默认时间格式化格式为yyyy-MM-dd HH:mm:ss.SSS
,如果需要格式化为时间戳,需要通过JSONField.format来配置
"millis"代表13位时间戳
"unixtime"代表10位时间戳
测试fastjson2版本是2.0.17
顺便翻了下fastjson的源码,发现fastjson也支持这个,但是fastjson和jackson是一样的,默认时间都是序列化为13位时间戳。fastjson2这里变了,可能是因为平时大家也都是用 yyyy-MM-dd HH:mm:ss.SSS
这种格式吧。
虽然这个可能是为了方便这么配置的,但是没有相关的文档说明,自己摸索还是挺麻烦的。