Android 从互联网上获取准确的时间

Android 从互联网上获取准确的时间,android,ntp,Android,Ntp,我正试图从互联网上获得时间,不想使用设备的时间。 我正在做下面的sntp客户端时间请求,但是由于请求-响应时间的原因,收到的时间不准确。如何克服延迟并获得+/-20ms的最大变化 Long time=0; while (true) { SntpClient client = new SntpClient(); if (client.requestTime("time-a.nist.gov",6000)) { long now = client.get

我正试图从互联网上获得时间,不想使用设备的时间。 我正在做下面的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

如何克服延迟并获得+/-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);
     }
    }
我不知道+/-20ms,但假设Android设备有GPS,你可以从GPS子系统获得时间,因为GPS时间必须非常精确。您可以使用。

client.requestTime是一种网络操作。我永远不能少于一定的时间,你绝对无法控制


您观察到的变化是由连接时间、网络质量……在java中的波动决定的。我用这个钻头睡觉

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

这5行是我的睡眠密码。试着使用它,看看你会得到什么结果。

在完美执行时,时间差预计为常数5000-Android不是RTO。此外,睡眠在完美执行时并不准确——它所做的只是安排线程在该毫秒数之后可用于调度。线程何时开始执行指令取决于操作系统,这将取决于设备的其他情况。因此,我可以假设我的值的变化是由于睡眠而不是延迟造成的吗?我的意思是,依赖睡眠来保证准确性是一种有缺陷的测试方法。请查看[这个问题][1]。下面列出了几种方法[1]:您是否设法与GPS同步?据我所知,Location.getTime提供获得位置更新时的系统时间,即该层不涉及GPS时钟。这是答案之一,正如我说的,我不想要这个系统-time@user1980743我们知道答案是正确的吗?但是,是的,即使涉及到GPS时钟,它仍然是对设备当前日期/时间的转换,这可能没有帮助。。。但是如果您只需要5000ms的间隔,不要使用getTime,而是使用。我没说使用getTime-不,这不是5000毫秒,5000毫秒是我测试用的。我需要两个或多个设备上的参考时钟相同。结果没有改进02-11 00:09:46.519:E/时差17610:-5716 02-11 00:09:51.950:E/时差17610:-5378 02-11 00:09:57.374:E/时差17610:-5460 02-11 00:10:02.850:E/时差17610:-5523 02-11 00:10:08.439:E/时差17610:-5575 02-11 00:10:13.783:E/时差17610:-5269 02-11 00:10:19.184:E/时差17610:-5438你是想得到像5020或更少的结果吗?我只是希望收到的时间是一致的。所以是的。你的代码没有问题。只是网络把你搞砸了。或者找一个更好/更快的服务器,或者在您的计算机上构建一个。因此无法在android设备上获取准确的时间?client.getNtpTime+SystemClock.elapsedRealtime-client.getNtpTimeReference相当准确。NtpimerReference是IIUC,从网络更新时间时的系统时间。SystemClock.elapsedRealtime-client.getntoptimereference告诉您从那一刻起您离目标有多近。