【问题标题】:Get Accurate UTC Time in Android在 Android 中获取准确的 UTC 时间
【发布时间】:2015-07-21 02:41:53
【问题描述】:

好的,这可能是基本的,但不幸的是我还没有找到任何可以帮助解决这个问题的东西。

我希望某些功能仅在特定于 UTC/GMT 时间的时间范围内出现在 Android 中。

你是怎么做到的?我尝试使用 System.currentTimeMillis(),但如果您在设置中更改 Android 设备上的时间,这也会更改 System.currentTimeMillis()。

我想获取一个等于 UTC/GMT 并且独立于 Android 设备设置时钟的时间,因此如果设备上的时钟发生更改,它不会干扰。

有什么想法吗?

谢谢! 克里斯托弗·史蒂文

【问题讨论】:

标签: java android java-time


【解决方案1】:

如果您想要一个真正准确的时间,time.nist.gov 是您的朋友。*

                String TIME_SERVER = "time.nist.gov";
                NTPUDPClient timeClient = new NTPUDPClient();
                InetAddress inetAddress = InetAddress.getByName(TIME_SERVER);
                TimeInfo timeInfo = timeClient.getTime(inetAddress);
                NtpV3Packet message = timeInfo.getMessage();

                //get the utc long from the server
                long serverTime = message.getTransmitTimeStamp().getTime();

(如果您在 Android 上运行,请务必将所有这些捆绑在一个线程中!)

我喜欢做的一件事是获取服务器时间和系统时间之间的差异并将其存储起来以备将来使用。简而言之,只要不摆弄系统时间,就不必进行多次时间调用。您可以只占用系统时间并根据差异进行更改。

*你需要 apache commons 才能工作。

【讨论】:

  • 感谢您的建议!在某些时候,我知道我需要发出一个后端请求,我可以让服务器在它的一个标头中将服务器时间传递给我,存储它,并将其与经过的时间进行比较
【解决方案2】:

您需要来自 Internet 的计时服务。您可以从 时间服务器 NIST

获取实时时间

apache-commons 有一个 TimeInfo 类来获取 NTP 日期

例如:NTPClient

【讨论】:

    【解决方案3】:

    System.nanoTime() 返回自启动时间以来的纳秒数,因此不受系统时钟变化的影响。

    在启动时使用:

    long startTime = System.TimeInMillis();
    long nanoToDeduct = System.nanoTime();
    

    然后在任何时间点,您都可以获得程序的当前时间,因为时钟是在程序启动时设置的

    long currentTime = startTime - timeToDeduct + System.nanoTime();
    

    【讨论】:

      猜你喜欢
      • 2019-12-04
      • 2023-03-27
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 2012-02-28
      相关资源
      最近更新 更多