从互联网获得准确的时间

时间:2014-02-10 18:02:49

标签: android ntp

我正在尝试从互联网上获取时间,并且不希望使用设备时间。 我正在执行以下sntp客户端请求的时间,但正如预期的那样,由于请求 - 响应时间,收到的时间不准确。如何克服延迟并获得+/- 20ms的最大变化

 Long time=0; 
    while (true) {
     SntpClient client = new SntpClient();
     if (client.requestTime("time-a.nist.gov",6000)) {
       long now = client.getNtpTime() + SystemClock.elapsedRealtime()
                        - client.getNtpTimeReference();
       Log.d("Time Difference", time-now+"");
       time=now;
       Thread.sleep(5000);
     }
    }

日志文件如下:

- 02-10 23:27:16.125: E/Time Difference(15566): -5804
- 02-10 23:27:21.449: E/Time Difference(15566): -5272
- 02-10 23:27:26.774: E/Time Difference(15566): -5358
- 02-10 23:27:32.206: E/Time Difference(15566): -5365
- 02-10 23:27:37.528: E/Time Difference(15566): -5328
- 02-10 23:27:43.056: E/Time Difference(15566): -5429
- 02-10 23:27:48.892: E/Time Difference(15566): -5694
- 02-10 23:27:54.730: E/Time Difference(15566): -5972
- 02-10 23:28:00.563: E/Time Difference(15566): -5679
- 02-10 23:28:06.096: E/Time Difference(15566): -5686

在完美执行时,时差预计为常数5000.

3 个答案:

答案 0 :(得分:0)

  

如何克服延迟并获得+/- 20ms的最大变化

我不知道+/- 20ms,但假设有问题的Android设备有GPS,你可以从GPS子系统获得时间,因为GPS时间(必须)非常精确。您可以使用requestSingleUpdate来解决这个问题,如this question and its answers中所述。

答案 1 :(得分:0)

client.requestTime是一项网络操作。我永远不会花费少于一定的时间,你完全无法控制。

您观察到的变化取决于连接时间,网络质量的波动......

答案 2 :(得分:-1)

在java中。睡觉我用这个。

long start = System.currentTimeMillis();
long current = start;
while(current - start < 5000){
    current = System.currentTimeMillis();     
}

5行是我的“睡眠”代码。尝试使用它,看看你得到了什么结果。