在Kotlin中如何将FirebaseRTDB的iOS Double时间戳转为Long?
Firebase RTDB跨平台时间戳兼容方案
问题背景
- iOS端通过Swift向Firebase RTDB写入秒级时间戳,类型为
Double(示例值:1633598017.489507) - Android端通过Kotlin写入毫秒级时间戳,类型为
Long(示例值:1689308567775) - 双方共享同一数据库,且已有大量iOS端写入的
Double类型时间戳,需在Android端兼容转换为Long类型以生成Date对象
转换逻辑
iOS的Double时间戳是自1970年以来的秒数,而Android的Date构造器需要的是自1970年以来的毫秒数,因此转换逻辑为:
- 将iOS的
Double时间戳乘以1000,把秒单位转换为毫秒单位 - 将结果转换为
Long类型(直接强转即可,不会有精度丢失,因为当前秒级时间戳乘以1000后远小于Double的精确整数范围)
完整代码实现
val timeStamp = map["timeStamp"] as? Long // 来自Android端的毫秒级时间戳 if (timeStamp != null) { val date = Date(timeStamp) } else { val iOSTimeStamp = map["timeStamp"] as? Double // 来自iOS端的秒级时间戳 iOSTimeStamp?.let { val convertedTimeStamp = (it * 1000).toLong() val date = Date(convertedTimeStamp) // 后续使用date对象的逻辑 } }
补充说明
- 精度保障:当前秒级时间戳约为
1.6×10^9,乘以1000后为1.6×10^12,而Double可以精确表示到2^53(约9×10^15),因此转换过程中不会出现整数精度丢失问题 - 长期优化建议:如果条件允许,可逐步将数据库中的时间戳统一为毫秒级
Long类型,消除跨平台兼容成本
内容的提问来源于stack exchange,提问作者Lance Samaria
相关产品推荐
相关产品推荐

