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
相关产品推荐
相关产品推荐

