NTP服务器推荐

NTP记录:
欢迎使用时间服务器:cn.ntp.org.cn
❤中国地区免费提供NTP服务❤
配置时间服务器请使用域名,避免IP地址变更影响时间同步
具体详细参考访问网站:www.ntp.org.cn

国家授时中心 网络授时服务器的域名为“ntp.ntsc.ac.cn”

NTP服务器列表:

区域[zone] 域名[Domain]
中国[China] cn.ntp.org.cn

其它NTP服务器列表:
中国教育网 edu.ntp.org.cn
中国香港 hk.ntp.org.cn
中国台湾 tw.ntp.org.cn
日本 jp.ntp.org.cn
韩国 kr.ntp.org.cn
新加坡 sgp.ntp.org.cn
美国 us.ntp.org.cn
德国 de.ntp.org.cn
印度尼西亚 ina.ntp.org.cn

代码参考

参考一(根据这个实现了)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
static DateTime GetDate()
{
// NTP 服务器地址和端口
string ntpServer = "ntp.aliyun.com"; // 使用公共 NTP 服务器
int ntpPort = 123;

// 创建 UDP 客户端
using (Socket udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
{
try
{
// 连接到 NTP 服务器
udpClient.Connect(ntpServer, ntpPort);

// 构建 NTP 请求数据包
byte[] requestData = new byte[48];
requestData[0] = 0x1B; // LI = 0, VN = 3, Mode = 3 (Client Mode)

// 发送 NTP 请求
udpClient.Send(requestData);

// 接收 NTP 响应
byte[] responseData = new byte[48];
int bytesRead = udpClient.Receive(responseData);

// 解析 NTP 响应以获取时间
if (bytesRead == 48)
{
ulong intPart = BitConverter.ToUInt32(responseData.Skip(40).Take(4).Reverse().ToArray(), 0);
ulong fracPart = BitConverter.ToUInt32(responseData.Skip(44).Take(4).Reverse().ToArray(), 0);
// 将分数部分从固定点数(Q32.32)转换为秒的小数部分(假设 fracPart 已经是 Big-Endian)
double fracSeconds = (fracPart / (double)uint.MaxValue) / (double)uint.MaxValue; // 或者使用 (fracPart / 4294967296.0) 但注意精度损失问题(这里使用 uint.MaxValue 来提高精度)

// 将 NTP 时间转换为 DateTime
DateTime networkDateTime = DateTimeOffset.FromUnixTimeSeconds((long)(intPart - 2208988800UL)).AddSeconds(fracSeconds).ToUniversalTime().LocalDateTime;

// networkDateTime = networkDateTime.AddMilliseconds((double));
return networkDateTime;

}
}
catch (Exception) { }
return DateTime.MinValue;
}
}

参考二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
需要命名空间加入
using System.Net;
using System.Net.Sockets;

private void buttonTest_Click(object sender, EventArgs e)
{
string str;
DateTime Ntp;
str = Ntp.ToString("yyyy-MM-dd HH:mm:ss");
string nowStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");//年月日小时分钟秒
MessageBox.Show(str + nowStr , "提示");
}

public static DateTime GetNetworkTime()
{
//default Windows time server
const string ntpServer = "time.windows.com";

// NTP message size - 16 bytes of the digest (RFC 2030)
var ntpData = new byte[48];

//Setting the Leap Indicator, Version Number and Mode values
ntpData[0] = 0x1B; //LI = 0 (no warning), VN = 3 (IPv4 only), Mode = 3 (Client Mode)

var addresses = Dns.GetHostEntry(ntpServer).AddressList;

//The UDP port number assigned to NTP is 123
var ipEndPoint = new IPEndPoint(addresses[0], 123);
//NTP uses UDP

using(var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
{
socket.Connect(ipEndPoint);

//Stops code hang if NTP is blocked
socket.ReceiveTimeout = 3000;

socket.Send(ntpData);
socket.Receive(ntpData);
socket.Close();
}

//Offset to get to the "Transmit Timestamp" field (time at which the reply
//departed the server for the client, in 64-bit timestamp format."
const byte serverReplyTime = 40;

//Get the seconds part
ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime);

//Get the seconds fraction
ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4);

//Convert From big-endian to little-endian
intPart = SwapEndianness(intPart);
fractPart = SwapEndianness(fractPart);

var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);

//**UTC** time
var networkDateTime = (new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds((long)milliseconds);

return networkDateTime.ToLocalTime();
}

// stackoverflow.com/a/3294698/162671
static uint SwapEndianness(ulong x)
{
return (uint) (((x & 0x000000ff) << 24) +
((x & 0x0000ff00) << 8) +
((x & 0x00ff0000) >> 8) +
((x & 0xff000000) >> 24));
}

相关链接(侵删)

  1. 使用C#查询NTP服务器
  2. C# 获取网络时间 使用 NTP
  3. NTP服务器推荐-国内时间服务器(实时更新2021.10)

=================我是分割线=================

欢迎到公众号来唠嗑: