我在android.location.Location
方法调用中使用getTime()
方法onLocationChanged
同步我的应用时间。问题是在某些设备上结果是正确的,在某些设备上快15秒。据我所知,这是因为GPS time and UTC difference。
如何检查设备是否知道这种差异?我需要在所有设备上同时显示我的应用程序。
我无法使用网络同步作为解决方案。
答案 0 :(得分:4)
根据docs:
public long getTime()
Return the UTC time of this fix, in milliseconds since January 1, 1970. Note that the UTC time on a device is not monotonic: it can jump forwards or backwards unpredictably. So always use getElapsedRealtimeNanos() when calculating time deltas. On the other hand, getTime() is useful for presenting a human readable time to the user, or for carefully comparing location fixes across reboot or across devices. All locations generated by the LocationManager are guaranteed to have a valid UTC time, however remember that the system time may have changed since the location was generated.
返回
time of fix, in milliseconds since January 1, 1970.
您是否尝试过getElapsedRealtimeNanos()?
要将其转换为日期use:
Date date = new Date(System.currentTimeMillis()
- SystemClock.elapsedRealtime()
+ location.getElapsedRealtimeNanos());
答案 1 :(得分:4)
这里可能有几个不同的因素。
GPS& UTC 强>
首先,当你指出GPS时间与UTC不同时。 GPS有一条消息,通告UTC当前的偏移量,请参阅here。可能并非所有移动设备中的GPS芯片都会关注它,或者当您要求GPS时间数据时尚未收到GPS偏移消息。
除非在Android API中支持发现这种情况,否则您将被简化为自己解释NMEA句子(我不知道Android是否可以使用它们),即使这样,它也将取决于究竟是什么制造商已决定接受这些判决。
根据this PDF,GPS接收器可能需要长达半小时才能收到完整的年历数据。年历包含当前的GPS / UTC偏移。
我的猜测是因为移动GPS芯片是围绕AGPS(辅助GPS)构建的,他们可能期望从蜂窝网络获取GPS年历数据,并且在保留或接收年历数据方面可能不太聪明为了自己。
因此,如果您的WiFi和移动电话网络范围不足(您说无法使用网络同步来获取时间......),手机的GPS芯片可能需要12.5分钟到半小时的时间开始给你UTC时间而不是GPS时间。
移动GPS芯片的开启时间很长。我猜测它们通常不会被操作系统启动足够长的时间才能获得整个年历。
如果这确实是你问题的原因那么你可能会沉没。 GPS年历数据不会经常改变AFAIK,因此您可能能够自己缓存它并以某种方式将其提供给OS / GPS,以便从本地小区基站读取它。然而,这开始听起来非常低,我怀疑Android支持这种年历注入(这是恶意软件的可怕的拒绝服务机会......)。
时钟漂移
另一个不太可能的因素是移动设备不一定以与桌面相同的方式运行NTP客户端。大多数Linux桌面发行版都安装了一个NTP客户端,该客户端不断在后台运行,使本地时钟与某个NTP服务器保持同步。手机(包括AFAIK Android)通常不需要那么高的时间精度,因此为了节省电池寿命,它们很少校正时钟,因此可能会产生大量的漂移。但是如果它变得糟糕15秒,我会感到惊讶,所以它可能不是由于这个原因。
答案 2 :(得分:-1)
根据尼尔·戴格拉斯·泰森(Neil deGrass Tyson)的说法,Android使用的是不包含自1982年以来添加的跳跃时间的GPS时间,而不是iOS来修正跳跃时间。自2009年以来就是已知的错误。https://issuetracker.google.com/issues/36911516
摩托罗拉Droid的时钟快约15秒。这意味着它的时钟 被设置为GPS时间而不是UTC。 GPS时代始于一月 1980年至今,已经有15秒钟的leap秒。 GPS无法识别 秒,因此它将UTC时间恰好缩短了15秒。