Unity获取网络时间

using System;
using System.Net;
using System.Net.Sockets;

public static class NetworkTimeHelper
{
    private const string DefaultNtpServer = "time.windows.com";
    private const int NtpPort = 123;

    /// <summary>
    /// 获取当前网络时间。
    /// </summary>
    /// <param name="ntpServer">NTP服务器地址,默认为 time.windows.com。</param>
    /// <returns>当前网络时间的本地表示。</returns>
    public static DateTime GetNetworkTime(string ntpServer = DefaultNtpServer)
    {
        try
        {
            // 创建NTP请求
            byte[] ntpRequestData = new byte[48];
            ntpRequestData[0] = 0x1B; // NTP协议版本和模式

            // 发送请求并接收响应
            using (var ntpClient = new UdpClient(ntpServer, NtpPort))
            {
                ntpClient.Send(ntpRequestData, ntpRequestData.Length);
                var ntpResponseData = ntpClient.Receive(ref new IPEndPoint(IPAddress.Any, 0));

                // 从响应数据中解析出时间戳
                ulong timestamp = (ulong)ntpResponseData[40] << 24 | 
                                  (ulong)ntpResponseData[41] << 16 | 
                                  (ulong)ntpResponseData[42] << 8 | 
                                  (ulong)ntpResponseData[43];

                // NTP时间起始日期(1900年1月1日)
                DateTime ntpEpoch = new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc);

                // 计算当前网络时间
                DateTime networkTime = ntpEpoch.AddSeconds(timestamp);

                // 转换为本地时区时间
                DateTime localTime = TimeZoneInfo.ConvertTimeFromUtc(networkTime, TimeZoneInfo.Local);

                return localTime;
            }
        }
        catch (SocketException ex)
        {
            throw new InvalidOperationException($"Failed to retrieve network time from {ntpServer}. Check network connection or server availability.", ex);
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException("An error occurred while retrieving network time.", ex);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DaLiangChen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值