2019 年 4 月 6 日之后从 Location.getTime 返回的日期错误(周数翻转)

Posted

技术标签:

【中文标题】2019 年 4 月 6 日之后从 Location.getTime 返回的日期错误(周数翻转)【英文标题】:Wrong date returned from Location.getTime after 6 April 2019 (week number rollover) 【发布时间】:2019-10-02 11:53:18 【问题描述】:

我有一部手机三星 N7100 (kitkat 4.4.2)。 2019 年 4 月 6 日之后,我开始获取日期为 1999 年的位置。

有时位置的日期是 2019 年,但在那之后设备将停止接收任何位置。

只有 adb 命令有帮助,但一段时间后设备停止接收任何位置。

settings put secure location_providers_allowed -gps
settings put secure location_providers_allowed +gps

我已尝试将固件更新到 android 6 和 7。没有任何帮助。

mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 0, this);
....

public void onLocationChanged(Location location) 
  Log.d(TAG, (new Date(location.getTime())).toLocaleString());

【问题讨论】:

它是week number rollover bug。不要以为你可以做任何事情。 似乎没有为 WNRO 准备好二进制驱动程序 (/bin/gpsd)。如果至少没有三星(和博通)的帮助,这将无法解决(除非您能够进行逆向工程或编写自己的驱动程序)。 【参考方案1】:

这与某些类型的 GPS 芯片上出现的GPS Week Number Rollover 问题有关。

一种解决方法是检测从location.getTime() 返回的值太旧(例如,在 2019 年之前),如果是,则添加差异(1024 周)。

这段代码应该可以在接下来的 20 年内使用:

long gpsTime = location.getTime();

// Adding 1024 weeks for chips with GPS Week Number Rollover issue
// 1024 * 7 * 24 * 60 * 60 * 1000 = 619315200000L
if ((gpsTime > 0) && (gpsTime < 1546300800000L))
  gpsTime += 619315200000L;

【讨论】:

你会在哪里添加这个? 无论你在哪里使用location.getTime(); 所以这是必须在应用程序中实现的东西?这将是非常不幸的,因为极不可能有人会为一些旧设备实现此功能。

以上是关于2019 年 4 月 6 日之后从 Location.getTime 返回的日期错误(周数翻转)的主要内容,如果未能解决你的问题,请参考以下文章

实验报告(2019年6月12日)

实验报告(2019年6月26日)

Jquery Sortable table,只会对一个日期列进行排序

实验报告(2019年4月31日)

php 将社区活动的登录表单重定向到您自己的登录表单。需要社区活动4。4。7(2017年6月1日)或之后。

php 将社区活动的登录表单重定向到您自己的登录表单。需要社区活动4。4。7(2017年6月1日)或之后。