Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以通过Java中的NTP客户端同步系统时钟?_Java_Synchronization_Client_Ntp - Fatal编程技术网

是否可以通过Java中的NTP客户端同步系统时钟?

是否可以通过Java中的NTP客户端同步系统时钟?,java,synchronization,client,ntp,Java,Synchronization,Client,Ntp,还是只知道系统时钟和服务器之间的偏移量?如果我的系统时钟因时区而与服务器不同,会发生什么情况? 谢谢Java没有直接设置系统时钟的API。这可以在Java类调用的C/C++本机代码中完成,但需要管理权限才能执行 有些Java库(如project)可以计算本地系统时钟和远程NTP服务器之间的时钟偏移。这提供了用于计算与本地时钟不同步的偏移量的代码。要实际同步,建议使用NTP客户端/服务器进行同步。几乎所有平台(Windows、Mac、Linux等)都有NTP实现 Java库和NTP服务使用基于UT

还是只知道系统时钟和服务器之间的偏移量?如果我的系统时钟因时区而与服务器不同,会发生什么情况?
谢谢

Java没有直接设置系统时钟的API。这可以在Java类调用的C/C++本机代码中完成,但需要管理权限才能执行

有些Java库(如project)可以计算本地系统时钟和远程NTP服务器之间的时钟偏移。这提供了用于计算与本地时钟不同步的偏移量的代码。要实际同步,建议使用NTP客户端/服务器进行同步。几乎所有平台(Windows、Mac、Linux等)都有NTP实现

Java库和NTP服务使用基于UTC的时间,因此时区设置无效

例如:

NTPUDPClient client = new NTPUDPClient();
client.open();
// use host name or IP address of target NTP server
InetAddress hostAddr = InetAddress.getByName("pool.ntp.org");
TimeInfo info = client.getTime(hostAddr);
info.computeDetails(); // compute offset/delay if not already done
Long offsetValue = info.getOffset();
Long delayValue = info.getDelay();
String delay = (delayValue == null) ? "N/A" : delayValue.toString();
String offset = (offsetValue == null) ? "N/A" : offsetValue.toString();

System.out.println(" Roundtrip delay(ms)=" + delay
                + ", clock offset(ms)=" + offset); // offset in ms
client.close();
请注意,本地时钟偏移(或时间漂移)是根据此标准NTP方程,针对本地时钟和NTP服务器的时钟计算的

LocalClockOffset = ((ReceiveTimestamp - OriginateTimestamp) +
                             (TransmitTimestamp - DestinationTimestamp)) / 2

操作系统时钟应该由操作系统来维护,而不是由Java代码来维护。如果您在运行不同时区的计算机之间进行客户机/服务器通信,则应确保双方就传输的日期值的格式达成一致,以避免出现时区问题,例如传输纯历元毫秒(始终为UTC),或使用新的或类。请更具体地说明:哪个客户机?Java标准API不支持设置系统时钟,但可能存在可以设置系统时钟的特定于平台的实现。(尽管您需要以提升的权限运行Java,而且它不如没有垃圾收集和JIT编译的非Java实现那样精确,以破坏计时)谢谢,我使用的客户端是apache客户端:使用NtpudPClient,该实现不会尝试更新系统时间,它只是告诉您NTP服务器与本地系统时钟的偏移量,我个人不知道有哪种实现可以做到这一点,但谁知道一些商业供应商可能会做什么。这里有一个关于从Java调整系统时间的讨论:我知道这篇文章很老了,但是你能解释一下ReceiveTimestamp、OriginateTimeStamp、TransmitTImeStamp和DestinationTimestamp吗。我想我了解除DestinationTimestamp之外的所有时间戳。NTP时间戳在本文中有描述