Android ScanResult 时间戳字段 - 它有多准确?

Android ScanResult Timestamp Field - How accurate is it?

我一直在使用 wifiManager.startScan();从附近的 Wi-Fi 接入点接收数据。这作为 ScanResult 列表返回。这个 class 可以在这里找到: http://developer.android.com/reference/android/net/wifi/ScanResult.html#timestamp

我了解到 ScanResult 的时间戳字段是

timestamp in microseconds (since boot) when this result was last seen.

所以我使用一些计算来获取智能手机设备何时看到接入点的实际时间戳:

long actualTimestamp = System.currentTimeMillis() - SystemClock.elapsedRealtime() + (scanResult.timestamp / 1000);

这很好用,但我得到了一些 罕见 有趣的结果:

15:04:01 28-03-2016 - 1459173841

22:50:44 07-06-2016 - 1465336244

15:04:21 28-03-2016 - 1459173861

请注意 2016 年 6 月条目上方的通知,这是一个未来的日期,位于从列表中收集的其他读数中。

这里可能发生了什么?我的代码有点错误吗?时间戳值是否偶尔不准确?以前有人经历过吗?

编辑:我正在 Nexus 5 Marshmallow 设备上对此进行测试。 MinSDK 18,目标 23

我好像有一个解释:这是一个bug。

我偶尔看到 .timestamp(自重启后的微秒数)等于 .seen(自大纪元以来的秒数)。如果重新解释为微秒时间段,现在大纪元时间约为 17 天。

由于2个值显然不能相等,所以提交给Android: https://code.google.com/p/android/issues/detail?id=225218 欢迎给问题加注星标:)

这个适合我

long actualTime = System.currentTimeMillis() - TimeUnit.MILLISECONDS.convert(SystemClock.elapsedRealtimeNanos() - scanResult.getTimestampNanos(), TimeUnit.NANOSECONDS)