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 @   edolf  阅读(474)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
  1. 1 天后 卢卢快闭嘴
  2. 2 珊瑚海 周杰伦&梁心颐
  3. 3 梦返 黄霄云
  4. 4 还可以爱吗 黄霄云
  5. 5 讲不出再见 谭咏麟
  6. 6 飞鸟和蝉 任然
  7. 7 下雨天 南拳妈妈
  8. 8 是你 梦然
  9. 9 一生中最爱 谭咏麟
下雨天 - 南拳妈妈
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

Not available

点击右上角即可分享
微信分享提示