一、NTP 是什么?
NTP 是网络时间协议(Network Time Protocol),它用来同步网络设备【如计算机、手机】的时间的协议。
二、NTP 实现什么目的?
目的很简单,就是为了提供准确时间。因为我们的手表、手机、电脑等设备,经常会跑着跑着时间就出现了误差,或快或慢的少几秒,时间长了甚至误差过分钟。
NTP 服务器列表
Windows系统上自带的两个:time.windows.com 和 time.nist.gov
MacOS上自带的两个:time.apple.com 和 time.asia.apple.com
NTP授时快速域名服务:cn.ntp.org.cn
中国科学院国家授时中心:ntp.ntsc.ac.cn
阿里云授时服务器:ntp.aliyun.com
腾讯云授时服务器:
time1.cloud.tencent.com
time2.cloud.tencent.com
time3.cloud.tencent.com
time4.cloud.tencent.com
time5.cloud.tencent.com
使用Java进行对时,必须引入commons-net包
<dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.8.0</version> <!-- 使用你需要的最新版本 --> </dependency>
编码非常简单,属于固定写法
package com.example.springboot.demo; import cn.hutool.core.date.DateUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.net.ntp.NTPUDPClient; import org.apache.commons.net.ntp.TimeInfo; import java.io.IOException; import java.net.InetAddress; import java.util.Date; @Slf4j public class NptTest { private static String nptUrl = "ntp.aliyun.com"; public static void main(String[] args) { NTPUDPClient timeClient = new NTPUDPClient(); try { // 设置超时时间为1000毫秒 timeClient.open(); timeClient.setDefaultTimeout(1000); timeClient.setSoTimeout(1000); // 将主机名"ntp.aliyun.com"解析为InetAddress InetAddress inetAddress; try { inetAddress = InetAddress.getByName(nptUrl); } catch (Exception e) { System.err.println("无法解析主机名: " + e.getMessage()); return; } // 与阿里云NTP服务器通信 TimeInfo timeInfo = timeClient.getTime(inetAddress); timeClient.close(); // 将接收到的时间转换为Date对象 long returnTime = timeInfo.getMessage().getTransmitTimeStamp().getTime(); Date time = new Date(returnTime); System.out.println(nptUrl + " 当前时间: " + DateUtil.formatDateTime(time)); } catch (IOException e) { e.printStackTrace(); } } }
END