如何与Moshi同时解析时间戳和时区偏移?

时间:2019-12-08 12:37:56

标签: kotlin timezone-offset moshi threetenbp

JSON-API响应包含以下属性:

created_at_timestamp: 1565979486,
timezone: "+01:00",

我正在使用MoshiThreeTenBp来解析时间戳,并准备了以下自定义适配器:

class ZonedDateTimeAdapter {

    @FromJson
    fun fromJson(jsonValue: Long?) = jsonValue?.let {
        try {
            ZonedDateTime.ofInstant(Instant.ofEpochSecond(jsonValue), ZoneOffset.UTC) // <---
        } catch (e: DateTimeParseException) {
            println(e.message)
            null
        }
    }

}

如您所见,此处的区域偏移为硬编码

class ZonedDateTimeJsonAdapter : JsonAdapter<ZonedDateTime>() {

    private val delegate = ZonedDateTimeAdapter()

    override fun fromJson(reader: JsonReader): ZonedDateTime? {
        val jsonValue = reader.nextLong()
        return delegate.fromJson(jsonValue)
    }

}

...

class ZoneOffsetAdapter {

    @FromJson
    fun fromJson(jsonValue: String?) = jsonValue?.let {
        try {
            ZoneOffset.of(jsonValue)
        } catch (e: DateTimeException) {
            println(e.message)
            null
        }
    }

}

...

class ZoneOffsetJsonAdapter : JsonAdapter<ZoneOffset>() {

    private val delegate = ZoneOffsetAdapter()

    override fun fromJson(reader: JsonReader): ZoneOffset? {
        val jsonValue = reader.nextString()
        return delegate.fromJson(jsonValue)
    }

}

按如下方式向Moshi注册适配器:

Moshi.Builder()
    .add(ZoneOffset::class.java, ZoneOffsetJsonAdapter())
    .add(ZonedDateTime::class.java, ZonedDateTimeJsonAdapter())
    .build()

解析各个字段(created_at_timestamptimezone)可以正常工作。但是,我想摆脱 硬编码区域偏移。解析timezone属性时,如何配置Moshi使其退回到created_at_timestamp属性。

相关

1 个答案:

答案 0 :(得分:2)

对于created_at_timestamp字段,您应该使用没有时区的类型。通常是Instant。它可以识别时刻,而与要解释的时区无关。

然后,在您的封闭类型中,您可以定义一种getter方法,以将即时和区域组合为一个值。 ZonedDateTime.ofInstant方法可以做到这一点。