C# 获取网络时间方法

// 获取网络时间方法
public static DateTime GetNetworkTime()
{
    try
    {
        //default Windows time server
        //用域名获取时候用这里
        //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) {52.231.114.183
       //用域名获取时候用这里
       //var addresses = Dns.GetHostEntry(ntpServer).AddressList;
        IPAddress[] IPAddressList = new IPAddress[1];
        //配置时间服务器IP
        IPAddress address = new IPAddress(new byte[] { 192, 168, 1, 1 });  // NTP IP 地址
        IPAddressList[0] = address;
        //The UDP port number assigned to NTP is 123
        var ipEndPoint = new IPEndPoint(IPAddressList[0], Convert.ToInt32(123));
        //NTP uses UDP
        var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        socket.Connect(ipEndPoint);
        //Stops code hang if NTP is blocked
        socket.ReceiveTimeout = 1000;

        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();
    }
    catch (Exception ex)
    {
        return DateTime.Now;
    }

}
static uint SwapEndianness(ulong x)
{
    return (uint)(((x & 0x000000ff) << 24) +
    ((x & 0x0000ff00) << 8) +
    ((x & 0x00ff0000) >> 8) +
    ((x & 0xff000000) >> 24));
}

 

posted @ 2024-03-24 08:15  edolf  阅读(454)  评论(0编辑  收藏  举报