如何获取网络标准时间

来源:互联网 发布:java如何导入jar包 编辑:程序博客网 时间:2024/06/06 02:13

我提供一种获取网络标准时间的方法

<span style="font-family:KaiTi_GB2312;font-size:18px;">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                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));        } </span>


0 0
原创粉丝点击