【问题标题】:How do I get the most accurate time with Android?如何使用 Android 获得最准确的时间?
【发布时间】:2014-02-13 16:09:01
【问题描述】:

我真的不认为这个问题是重复的。
大多数类似问题的答案都说使用 System.currentTimeMillis() 作为最准确的时间,但我注意到两个并排的 Android 设备可能彼此相差 5 秒或更长时间,或者(更重要的是)实时,我相信 currentTimeMillis() 会反映这种差异。

所以我真正在寻找的是一个全面的解决方案,可以在给定的时刻获得尽可能准确的时间。
例如,它会从 GPS 开始,如果它不可用或没有信号,则回退到 SNTP,或者如果这不起作用,则要求 Android 通过其自己的 SNTP 或运营商 NITZ 刷新其挂钟。

我的目标是在 0.1 秒内准确。
这可能吗?
谢谢。

【问题讨论】:

  • 我认为你必须求助于世界各地的原子钟。因此,互联网连接必须处于活动状态,才能同步设备的内部时钟 - 它将根据当前的 UTC 偏移设置进行同步。

标签: java android clock


【解决方案1】:

这可能吗?

这取决于你对“那个”的定义。

所以,让我们先检查一下你的其余材料...

从 GPS 开始

GPS times are not especially accurate depending on hardware。我认为您还需要使用NmeaListener 尝试直接从 NMEA 语句中解析时间数据,因为Location 上的 AFAIK getTime() 是系统时间,而不是一些 GPS 时间。另外,请记住 GPS 访问不是通用的(用户可能已专门禁用它,用户可能已将设备置于飞行模式,用户可能在没有可用 GPS 信号的大型建筑物中)。

回退到 SNTP

您可以尝试许多 SNTP 客户端代码位。请记住,互联网连接不是通用的(设备可能在任何已知接入点之外仅支持 WiFi,用户可能已将设备置于飞行模式,设备可能支持移动数据但在当前位置没有信号强度)。

如果这不起作用,请让 Android 通过其自己的 SNTP 或运营商 NITZ 刷新其挂钟

可以想象,root 设备可能能够以某种方式执行此操作,但 Android SDK 中没有任何内容可供普通应用强制执行此类刷新。请记住,连通性不是通用的(参见上一段中的名册)。

所以,回到:

这可能吗?

如果“那个”是保证在所有情况下都有效的解决方案,那么不,这是不可能的,因为不能保证您有任何与任何时间源进行通信的能力。

如果“that”是一种保证在设备具有 Internet 连接的情况下工作的解决方案,那么您需要询问您的 SNTP 客户端库实施者是否可以达到 100 毫秒的精度。 SNTP 是您唯一可以完全控制的策略之一,除了连接问题,因为 GPS 可能不准确,而且 NITZ 不是您自己管理的。

【讨论】:

  • 不错的答案。不过,我不认为飞行模式会直接禁用 GPS,因为它会禁用 transmitters 并且 GPS 设备只会接收。不过,正如您所指出的,GPS 可能无法正常工作还有其他原因。
  • @AndrewAylett:“我不认为飞行模式会直接禁用 GPS”——好点,我已经在我的答案中添加了删除线。谢谢!
  • 感谢您的信息。看起来 SNTP 是要走的路,如果失败了,currentTimeMillis() 是最好的(唯一的?)替代方案。
  • @ScottBowers:嗯,只有一个系统时钟,它是 currentTimeMillis() 的源。欢迎您尝试弄清楚如何将 GPS 实现列入白名单,并尝试将 GPS 时间值用于数据显示良好的设备。不过,在某些时候,您需要权衡与将时间花在应用的其他方面或整体业务的其他方面(如果您是独立开发者)相比,这在多大程度上是“镀金”。跨度>
猜你喜欢
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
相关资源
最近更新 更多