在 Kotlin 中将时间戳转换为 Java 8 API ZonedDateTime

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

我有这个 json:

  {
    "name": "Hungarian Translation",
    "language": "hu",
    "created_at": 1676618826043,
  }

并想将其转换为 Kotlin 数据类:

data class TranslationBook(
    val name: String,
    val language: String,
    val created_at: Long,
    val createdAt: ZonedDateTime? =
        ZonedDateTime.ofInstant(Instant.ofEpochMilli(created_at), ZoneId.of("Asia/Jakarta")),
) : Parcelable

那是我想将 created_at 时间戳保存为 createdAt 属性中的 ZonedDateTime。但是,createdAt 属性始终为空。我错过了什么?

kotlin java-8 java-time
1个回答
0
投票

createdAt
属性可能设置为 null,因为您正在将 JSON 反序列化为此类,反序列化器无法在 JSON 中找到“createdAt”键,因此它只是将 null 传递给构造函数。

如果你只是想创建一个从另一个属性计算的属性,你可以写一个 getter:

val creationZonedDateTime: ZonedDateTime
    get() = ZonedDateTime.ofInstant(Instant.ofEpochMilli(created_at), ZoneId.of("Asia/Jakarta"))

请注意,我已将新属性命名为

creationZonedDateTime
,使其与
created_at
相比更具特色。我还建议重命名
created_at
以使用驼峰大小写,以保持一致。当然,这需要您以一种或另一种方式指定其 JSON 键名,具体取决于您使用的库。

由于 getter 会在您每次访问该属性时创建一个新的

ZonedDateTime
,因此您也可以使其延迟计算:

val creationZonedDateTime: ZonedDateTime by lazy {
    ZonedDateTime.ofInstant(Instant.ofEpochMilli(created_at), ZoneId.of("Asia/Jakarta"))
}
© www.soinside.com 2019 - 2024. All rights reserved.