Java 不使用系统时间的NTP服务器
我有一台没有互联网连接或GPS接收器的台式电脑。我需要构建一个NTP服务器应用程序,最好使用JAVA,而不使用系统时间 我使用了以下方法Java 不使用系统时间的NTP服务器,java,time,ntp,Java,Time,Ntp,我有一台没有互联网连接或GPS接收器的台式电脑。我需要构建一个NTP服务器应用程序,最好使用JAVA,而不使用系统时间 我使用了以下方法 public void run() { Date oDate = new Date(); time = oDate.getTime(); System.out.println("Syst Time--->"+oDateFormat.format(time)); while(tru
public void run()
{
Date oDate = new Date();
time = oDate.getTime();
System.out.println("Syst Time--->"+oDateFormat.format(time));
while(true)
{
try
{
Thread.sleep(100);
time = time+100;
oDate = new Date();
if(time % 11443 == 1)
{
System.out.println("Time--->"+oDateFormat.format(time)+" Syst Time--->"+oDateFormat.format(oDate));
oDate = null;
}
}
catch (InterruptedException ex)
{
Logger.getLogger(NTPServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
我所做的是有一个线程休眠100毫秒,之后我将100添加到保持时间的time变量中。
但每次打印时,它都会与系统时间相差2-3秒。基本上它不准确
还有别的办法吗 您可以根据文档使用:
此方法只能用于测量经过的时间,不适用于
与系统或挂钟时间的任何其他概念相关
因此,在使用系统时间时不会违反您的要求。然后您基本上需要执行以下操作:
long before = System.nanoTime();
Thread.sleep(100);
long after = System.nanoTime();
time = time+((after-before)/1000000L);
生产代码应该知道在睡眠期间nanoTime可能发生的溢出。使用Thread.sleep(100)
不会确保每100毫秒执行一次循环。至少有两件事需要考虑:
- 在调用
之间执行的代码本身需要时间Thread.sleep(100)
不能精确睡眠100毫秒,但至少睡眠100毫秒。当程序在Thread.sleep(100)
未定义,取决于实现定义的方面,如VM调度程序和OS调度程序线程之后真正继续运行时。sleep()
您必须依赖于系统时间,使用
system.currentTimeMillis()
和system.nanoTime()
仅仅依赖sleep()是不够精确的。难道你不能以系统时间为基准,将系统时间和GPS时间之间的差异存储为偏移量,并在需要时计算出实时时间吗?当您每隔几秒钟或几分钟更新一次偏移量时,即使系统时间漂移严重,您也应该可以。实际上new Date()
已经在使用系统时间。@SpaceTrucker是的,我假设系统时间第一次是正确的,然后它就漂移了。所以我先从系统中获取正确的时间,然后试图阻止它漂移。@ThomasStets,但偏移量是静态的,对吗?漂移是每小时一秒,相当大。所以,假设我一开始得到1秒的偏移量,我不能在一天结束时减少太多偏移量。@Tattu抱歉,我似乎没有足够仔细地阅读你的问题。我读到你有GPS数据,而你却说没有。系统时间漂移是否为常数,即始终为每小时1秒?如果你知道你第一次阅读是多久以前,你就可以弥补这一点。如果漂移本身波动,你就不走运了。即使您设法从sleep()获取一些有意义的信息,此方法本身也依赖于系统时钟。也许这可以帮助你调整你的时钟(如果你运行Linux):是的,我知道关于睡眠(int),但我只是想评估一下漂移是如何进行的。这行不通。这就是我发布寻求帮助的原因:)我的目标是最大限度地减少时间漂移,比如说一周一秒钟或者其他时间。但我觉得你是对的,这似乎很难。