如何使用 Moshi 同时解析时间戳和时区偏移量?
How to parse time stamp and time zone offset simultaneously with Moshi?
JSON-API-响应包含以下属性:
created_at_timestamp: 1565979486,
timezone: "+01:00",
我正在使用 Moshi and ThreeTenBp 解析时间戳并准备了以下自定义适配器:
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_timestamp
、timezone
)工作正常。然而,我想要 摆脱 硬编码 区域偏移。我如何配置 Moshi 在解析 created_at_timestamp
属性.
时回退到 timezone
属性
相关
对于 created_at_timestamp
字段,您应该使用没有时区的类型。这通常是 Instant
。它标识一个独立于解释它的时区的时刻。
然后在您的封闭类型中,您可以定义一个 getter 方法来将瞬间和区域组合成一个值。 ZonedDateTime.ofInstant
方法可以做到这一点。
JSON-API-响应包含以下属性:
created_at_timestamp: 1565979486,
timezone: "+01:00",
我正在使用 Moshi and ThreeTenBp 解析时间戳并准备了以下自定义适配器:
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_timestamp
、timezone
)工作正常。然而,我想要 摆脱 硬编码 区域偏移。我如何配置 Moshi 在解析 created_at_timestamp
属性.
timezone
属性
相关
对于 created_at_timestamp
字段,您应该使用没有时区的类型。这通常是 Instant
。它标识一个独立于解释它的时区的时刻。
然后在您的封闭类型中,您可以定义一个 getter 方法来将瞬间和区域组合成一个值。 ZonedDateTime.ofInstant
方法可以做到这一点。