是否可以通过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时间戳在本文中有描述