c#获取网络时间并同步本地时间

通过TCP形式来获取NTP时间。主要代码如下:

 [DllImport("kernel32.dll")]
        private static extern bool SetLocalTime(ref Systemtime time);

        [StructLayout(LayoutKind.Sequential)]
        private struct Systemtime
        {
            public short year;
            public short month;
            public short dayOfWeek;
            public short day;
            public short hour;
            public short minute;
            public short second;
            public short milliseconds;
        }

        /// <summary>
        /// 设置系统时间
        /// </summary>
        /// <param name="dt">需要设置的时间</param>
        /// <returns>返回系统时间设置状态,true为成功,false为失败</returns>
        public static bool SetLocalDateTime(DateTime dt)
        {
            Systemtime st;

            st.year = (short)dt.Year;
            st.month = (short)dt.Month;
            st.dayOfWeek = (short)dt.DayOfWeek;
            st.day = (short)dt.Day;
            st.hour = (short)dt.Hour;
            st.minute = (short)dt.Minute;
            st.second = (short)dt.Second;
            st.milliseconds = (short)dt.Millisecond;
            bool rt = SetLocalTime(ref st);
            return rt;
        }

        public static DateTime GetDateTime(long timeStamp)
        {
            return new DateTime(1970, 1, 1).AddSeconds(timeStamp).ToLocalTime();
        }

        public static bool GetInternetTime(string url, out DateTime dt, out string errMsg)
        {
            dt = DateTime.MinValue;
            var startDt = DateTime.Now;
            var port = 13;
            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) { ReceiveTimeout = 2000 };
            try
            {
                var iphostinfo = Dns.GetHostEntry(url);
                var ip = iphostinfo.AddressList[0];
                var ipe = new IPEndPoint(ip, port);

                var iar = socket.BeginConnect(ipe, null, null);
                if (!iar.AsyncWaitHandle.WaitOne(5000))
                {
                    errMsg = "连接超时" + url;
                    return false;
                }
                var recvBuffer = new byte[1024];
                var sb = new StringBuilder();
                var myE = Encoding.UTF8;

                int nBytes;
                while ((nBytes = socket.Receive(recvBuffer, 0, 1024, SocketFlags.None)) > 0)
                {
                    sb.Append(myE.GetString(recvBuffer, 0, nBytes));
                }
                var o = sb.ToString().Split(‘ ‘);

                TimeSpan ts = DateTime.Now - startDt;

                var setDt = Convert.ToDateTime(o[1] + " " + o[2]).Subtract(-ts); // 减去中途消耗的时间

                dt = setDt.ToLocalTime();
                Console.WriteLine(@"服务器:{0}时间:{1}", url, setDt);
                errMsg = "";
                return true;
            }
            catch (Exception ex)
            {

                errMsg = ex.Message;
                return false;
            }
            finally
            {
                socket.Close();
            }
        }

  

源码如下:

https://files.cnblogs.com/files/lizhijian/%E8%8E%B7%E5%8F%96%E7%BD%91%E7%BB%9C%E6%97%B6%E9%97%B4.rar

感谢阅读

原文地址:https://www.cnblogs.com/lizhijian/p/8523373.html

时间: 2024-10-09 18:12:58

c#获取网络时间并同步本地时间的相关文章

如何将一个格林威治字符串时间格式化转换为本地时间

python 时间函数学习了一大堆,那到底怎么将一个格林威治的时间字符串转换为本地时间呢? 这里将以一个格林威治时间字符串转换为北京时间为例进行说明. 格林威治时间字符串:2015-08-31T11:20:48 首先将这个字符串转换为表示时间的tuple格式: >>> t=time.strptime('2015-08-31T11:20:48','%Y-%m-%dT%H:%M:%S') >>> t time.struct_time(tm_year=2015, tm_mon

Linux同步本地时间

同步时钟 输入如下命令: sudo apt-get install chrony sudo ntpdate ntp.ubuntu.com 原文地址:https://www.cnblogs.com/crazy-snail/p/9300437.html

服务器时间无法同步北京时间

1.[[email protected] ~]# rm -rf /etc/localtime   2.[[email protected] ~]# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

C/C++获取本地时间常见方法

跨平台方法 方法一:手动暴力法 #include <iostream> using namespace std; #include <time.h> time_t t = time(NULL); struct tm* stime=localtime(&t); char tmp[32]={NULL}; sprintf(tmp, "%04d-%02d-%02d %02d:%02d:%02d",1900+stime->tm_year,1+stime-&g

php获取时间问题,用默认配置读到本地时间。。。。。

用date获取到时间有8小时时差 因为php用date获取到的是格林威治时区的时间,而大陆时间和格林威治时间有8个小时时差,所以.... 修改:网上有各种修改方式: 比如:在程序中添加时间的初始化的语句的 即:"date_default_timezone_set("Asia/Shanghai"); "这个可以由程序员任意设置. 时区标识符: 大陆内地可用的值是:PRC,Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi (依次为中国

转自文翼的博客:将本地时间转换为 GMT 时间

在写 RSS 订阅接口的时候,发现最终输出文章的 RSS 时间(GMT时间),在本地上显示的时间和在服务器上显示的时间不一致. 原因是时区不一致,那么在 JavaScript 中,如何将时间转换为统一的时间呢? 1. 查看本地和服务器的时区 通过 date 命令,可以知道: 本地的时区是:GMT+0800 (CST) 服务器的时区是:GMT+0400 (MSK) 首先,需要明确的一点是,文章上的时间是基于本地时间的,也就是说是 GMT+0800 (CST). 2. 代码调试 便于理解,我们来举个

SQL Server 的本地时间和UTC时间

一,本地时间和UTC时间 本地时间 世界的每个地区都有自己的本地时间,整个地球分为二十四时区,每个时区都有自己的本地时间. UTC时间 在国际无线电通信中,为统一而普遍使用一个标准时间,称为通用协调时(UTC, Universal Time Coordinated).UTC时间和英国伦敦的本地时间相同. UTC时间在世界各地都是相同的,但是不同的时区,本地时间各不相同.根据UTC时间和所在的时区,能够计算出本地时间. 二,获取本地时间和UTC时间 在Sql Sever中,GetDate()返回的

Solr 17 - Solr的时间为什么比本地少8小时(附修改方法)

目录 1 为什么少8小时 2 如何查看Solr的时区 3 修改Solr的时区 3.1 Solr从数据库中同步数据的原理 3.2 为什么要修改时区 3.3 如何修改时区 1 为什么少8小时 (1) 原因: Solr服务中默认使用的是UTC时间, 而中国本地时间为东八时区, 即比UTC标准时间多8小时. (2) 示例: ① 中国内地服务器时间为2018-10-10 20:00:00, 系统将当前时间添加到Solr索引中时, Solr底层发现此时间的格式为UTC + 8, 它将对该时间减去8小时处理,

设置linux服务器定时与时间服务器同步

在一些大公司经常出现这样一个情况:公司或一些机关单位的内部业务系统的应用服务器以及数据都是做的多机集群部署而且基本都是linux系统,而且都是内部网,不与外网通讯的.这样经常就会出现一个情况,我发送任务的时间还晚于对方任务接收的时间.这样经常令我们头痛,那为什么会出现这样一个情况呢,其实就是linux机器的系统没有定时同步导致的,这个问题不仅linux系统有,windows系统也会出现这样的问题,比如我们的windows系统很久没开过机了,那么我们就会发现windows系统上的时间不对了,但是为