为什么OnLocationChanged回调返回的Location对象包含过时的时间戳?
问题原因
- 核心触发点是GPS周数翻转问题:GPS信号的周数字段最初为10位设计,每1024周(约19.7年)就会归零溢出,2019年4月6日发生了第二次周数翻转,未兼容该特性的旧GPS驱动会将当前周数识别为上一周期的数值,最终计算出的时间戳会比实际时间少约19年,和你观测到的2002年左右的时间结果完全吻合。
- 系统版本兼容性缺陷:Android 2.3 Gingerbread的官方GPS服务层没有预置周数翻转的兼容逻辑,且该系统版本早已停止维护,厂商不会针对老ROM推送GPS固件更新,因此从
OnLocationChanged回调中获取的Location.getTime()返回值自带固定的19年级别偏差。
修复方案(仅依赖GPS时间,不调用系统时间)
- 加固定偏移量修正:周数翻转带来的时间偏差是固定值,即1024周对应的毫秒数
619315200000,你可以直接将所有从GPS定位拿到的原始时间戳加上该值,即可得到正确的GPS时间。 - 加时间连续性校验:每次拿到新的GPS时间戳后,和上一次修正完成的时间做差值校验,正常单次定位的时间差不会超过1小时,若差值超出合理范围则丢弃该异常值,避免GPS信号弱导致的偶发计算错误。
- 可选闰秒对齐:GPS时间本身不包含闰秒调整,截至2021年GPS时间比UTC时间(Unix时间戳基准)快18秒,如果你需要对齐标准Unix时间戳,可以在修正后的时间基础上再减去
18000毫秒的闰秒差值即可,该值仅在官方发布新的闰秒调整公告时才会变动,老系统可直接写死使用。
内容的提问来源于stack exchange,提问作者greenoldman
相关产品推荐
相关产品推荐

