当前位置: 首页 > 工具软件 > fastJSON 2 > 使用案例 >

fastjson2 如何序列化时间为时间戳

董和风
2023-12-01

前言

项目中老接口是返回的时间戳给前端,新项目使用了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这种格式吧。

虽然这个可能是为了方便这么配置的,但是没有相关的文档说明,自己摸索还是挺麻烦的。

 类似资料: