使用gson dateformat序列化和反序列化unix时间戳

问题描述 投票:0回答:2

我正在使用 Gson 序列化/反序列化我的 pojo,目前正在寻找一种干净的方法来告诉 Gson 将日期属性解析/输出为 unix 时间戳。 这是我的尝试:

Gson gson = new GsonBuilder().setDateFormat("U").create();

来自 PHP,其中“U”是用于将日期序列化/反序列化为 unix 时间戳的日期格式,当运行我的尝试代码时,我是一个

RuntimeException
:

未知模式字符“U”

我假设 Gson 在底层使用了

SimpleDateformat
,它没有定义字母“U”。

我可以实现自定义

DateTypeAdapter
,但我正在寻找一种更干净的方法来实现这一目标。只需更改
DateFormat
就很好了。

java android gson date-format unix-timestamp
2个回答
27
投票

TL;DR:使用以下要点UnixTimestampAdapter.java


创建自定义

TypeAdapter
(
UnixTimestampAdapter
) 是正确的选择。

UnixTimestampAdapter

public class UnixTimestampAdapter extends TypeAdapter<Date> {

    @Override
    public void write(JsonWriter out, Date value) throws IOException {
        if (value == null) {
            out.nullValue();
            return;
        }
        out.value(value.getTime() / 1000);
    }

    @Override
    public Date read(JsonReader in) throws IOException {
        if (in.peek() == JsonToken.NULL) {
            in.nextNull();
            return null;
        }
        return new Date(in.nextLong() * 1000);
    }

}

现在,您必须选择(取决于您的用例):

1 - 如果您想在所有日期字段上应用此序列化,请在创建

UnixTimestampAdapter
实例时注册
Gson

Gson gson = new GsonBuilder()
                   .registerTypeAdapter(Date.class, new UnixTimestampAdapter())
                   .create();

2 - 如果您希望它仅应用于某些特定字段,则可以使用

@JsonAdapter
注释您的日期字段(如 @Marcono1234 建议)。

class Person {
    @JsonAdapter(UnixTimestampAdapter.class)
    private Date birthday;
}

-2
投票

时间戳只是

long
,因此您可以在 POJO 中使用它。 或者,如果该字段缺失,请使用
Long
获取
null

class myPOJO {
    Long myDate;
}
© www.soinside.com 2019 - 2024. All rights reserved.