本文提供一种可靠的方法,使用C#从NTP服务器检索当前日期和时间。以下是涉及的步骤和完整的代码解决方案。
此方法依赖于网络时间协议(NTP),它涉及向NTP服务器发送查询消息。服务器会回复包含当前时间的回复消息。然后,我们从回复中提取时间并将其转换为可用的格式。
using System; using System.Net; using System.Net.Sockets; public static class NTP { public static DateTime GetNetworkTime() { const string ntpServer = "time.windows.com"; const int ntpPort = 123; byte[] ntpData = new byte[48]; ntpData[0] = 0x1B; // LI = 0, VN = 3, Mode = 3 (Client) using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) { socket.Connect(new IPEndPoint(Dns.GetHostEntry(ntpServer).AddressList[0], ntpPort)); socket.Send(ntpData); socket.Receive(ntpData); } const int serverReplyTime = 40; ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime); ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4); intPart = SwapEndianness(intPart); fractPart = SwapEndianness(fractPart); long milliseconds = (long)(intPart * 1000) + (long)((fractPart * 1000) / 0x100000000L); DateTime networkDateTime = new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(milliseconds); return networkDateTime.ToLocalTime(); } private static ulong SwapEndianness(ulong x) { return (ulong)( ((x & 0x000000ff) << 24) | ((x & 0x0000ff00) << 8) | ((x & 0x00ff0000) >> 8) | ((x & 0xff000000) >> 24) ); } }
使用此代码,您可以轻松查询NTP服务器并获取当前日期和时间。此解决方案处理字节序转换,并提供了一种灵活的方式来从任何兼容的NTP服务器检索时间。 注意代码中SwapEndianness
函数的修正,以确保正确的字节序转换。
以上是如何使用C#查询当前日期和时间的NTP服务器?的详细内容。更多信息请关注PHP中文网其他相关文章!