You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin中如何将ISO日期字符串转为com.google.protobuf.Timestamp

Android Kotlin 实现ISO日期字符串转Protobuf Timestamp

方法一:借助Java 8时间API(推荐)

com.google.protobuf.Timestamp原生支持与java.time.Instant互转,标准ISO 8601格式的字符串可直接通过Instant.parse()解析,代码简洁且安全:

import com.google.protobuf.Timestamp
import java.time.Instant

fun isoStringToProtobufTimestamp(isoString: String): Timestamp {
    val instant = Instant.parse(isoString)
    return Timestamp.fromInstant(instant)
}

兼容低版本Android

若应用需支持API 26以下设备,需在模块的build.gradle中启用Desugar以支持Java 8时间API:

android {
    compileOptions {
        coreLibraryDesugaringEnabled true
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

dependencies {
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
}

方法二:手动解析(无Java 8依赖)

若不想引入Desugar,可手动拆分ISO字符串,提取秒数和纳秒后构建Timestamp:

import com.google.protobuf.Timestamp

fun isoStringToProtobufTimestamp(isoString: String): Timestamp {
    // 拆分时间主体与纳秒部分
    val parts = isoString.split(".")
    val dateTimeStr = parts[0].replace("T", " ").removeSuffix("Z")
    val nanoStr = parts.getOrElse(1) { "0" }.removeSuffix("Z")

    // 解析秒数(强制UTC时区)
    val sdf = java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").apply {
        timeZone = java.util.TimeZone.getTimeZone("UTC")
    }
    val seconds = sdf.parse(dateTimeStr).time / 1000

    // 处理纳秒:补全至9位,超出部分截断
    val nanos = nanoStr.padEnd(9, '0').take(9).toInt()

    return Timestamp.newBuilder()
        .setSeconds(seconds)
        .setNanos(nanos)
        .build()
}

注意:SimpleDateFormat并非线程安全,多线程场景下建议用ThreadLocal包裹实例,或每次调用时新建对象。

通用注意事项

  • 两种方法均兼容你提供的2023-06-13T19:34:35.12345Z格式,其中短纳秒段会自动补零(示例中的12345会转为123450000纳秒)。
  • 生成的Timestamp对象可直接赋值给Proto DataStore对应的字段完成存储。

内容的提问来源于stack exchange,提问作者me.at.coding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 21:23:10