咨询React Native与Swift时间戳等价方法及Firebase消息排序异常问题
双端时间戳格式对齐方案
两种时间取值的核心差异
- React Native 端当前使用的
new Date().getTime():返回自1970-01-01 UTC 起的毫秒级整数值 - Swift 端当前使用的
Date().timeIntervalSince1970:返回自1970-01-01 UTC 起的秒级浮点数值
两者数值相差1000倍,这也是跨端数据存储到Firebase后消息排序错乱的根本原因。
JS侧的对应转换方法
- 与Swift
Date().timeIntervalSince1970等价的JS实现:
直接将毫秒时间戳除以1000,即可得到完全一致的秒级时间值:new Date().getTime() / 1000 - 将Swift生成的秒级时间值反向适配JS原生时间逻辑的实现:
直接将秒级时间值乘以1000,即可转换为JS原生支持的毫秒时间戳:swift返回的秒级时间值 * 1000
Firebase存储场景下的排序问题修正
- 选择统一存储格式后即可解决排序异常,二选一即可:
- 统一存储毫秒级整数时间戳:将Swift端取值逻辑修改为
Date().timeIntervalSince1970 * 1000,与RN端现有逻辑保持一致 - 统一存储秒级浮点时间戳:将RN端取值逻辑修改为
new Date().getTime() / 1000,与Swift端现有逻辑保持一致
- 统一存储毫秒级整数时间戳:将Swift端取值逻辑修改为
- 已入库的历史异常数据可通过数值区间批量识别修正:数值大于1e12的为毫秒级时间戳,按规则换算为统一格式;数值处于1e9~1e10区间的为秒级时间戳,换算为统一格式后即可恢复正常排序。
内容的提问来源于stack exchange,提问作者Gurmukh Singh
相关产品推荐
相关产品推荐

