慕沐林林
我知道这是一个古老的问题,但是我注意到所有答案并未说明如何使用这些库。在这个答案中,我们将展示基本的实现及其背后的逻辑。一种简单的实现方法是使用Apache Commons Net库。该库将提供一个NTPUDPClient类来管理无连接NTP请求并返回一个TimeInfo实例。此实例应计算系统时间与NTP服务器时间之间的偏移量。让我们尝试在这里实现它:将Apache Commons Net库添加到您的项目中。 commons-net commons-net 3.6创建NTPUDPClient该类的新实例。设置默认超时时间和InetAddressNTP服务器的超时时间。调用该NTPUDPClient.getTime()方法以TimeInfo从指定服务器检索具有时间信息的实例。computeDetails()用于计算和验证NTP消息包详细信息的调用方法。最后,获取offset并计算原子时间。这里我们有一个基本的实现:import java.net.InetAddress;import java.util.Date;import org.apache.commons.net.ntp.NTPUDPClient; import org.apache.commons.net.ntp.TimeInfo;public class NTPClient { private static final String SERVER_NAME = "pool.ntp.org"; private volatile TimeInfo timeInfo; private volatile Long offset; public static void main() throws Exception { NTPUDPClient client = new NTPUDPClient(); // We want to timeout if a response takes longer than 10 seconds client.setDefaultTimeout(10_000); InetAddress inetAddress = InetAddress.getByName(SERVER_NAME); TimeInfo timeInfo = client.getTime(inetAddress); timeInfo.computeDetails(); if (timeInfo.getOffset() != null) { this.timeInfo = timeInfo; this.offset = timeInfo.getOffset(); } // This system NTP time TimeStamp systemNtpTime = TimeStamp.getCurrentTime(); System.out.println("System time:\t" + systemNtpTime + " " + systemNtpTime.toDateString()); // Calculate the remote server NTP time long currentTime = System.currentTimeMillis(); TimeStamp atomicNtpTime = TimeStamp.getNtpTime(currentTime + offset).getTime() System.out.println("Atomic time:\t" + atomicNtpTime + " " + atomicNtpTime.toDateString()); } public boolean isComputed() { return timeInfo != null && offset != null; }}您将获得类似的内容:System time: dfaa2c15.2083126e Thu, Nov 29 2018 18:12:53.127Atomic time: dfaa2c15.210624dd Thu, Nov 29 2018 18:12:53.129