时间的处理--与网络时间同步

时间准确的重要性不言而喻,有时候我们对时间的要求非常严格,有时候也要求不允许用户调整系统时间,有时候。。。等等情况下,我们都需要时间的同步,虽然Windows也有DOS命令来保持和时钟服务进行同步,但本文另辟途径,介绍另一种获取标准时间并同步时间的操作。

首先,我们来看看一个网站:国家授时中心(http://www.time.ac.cn/stime.asp),这个是应该是时间的权威机构,里面有各国各地的时间,我们可以通过同步该时间来实现系统时间的更新。首先分两步,一步是获取“国家授时中心”的时间,一步是更新系统时间。下面的代码就是做这些工作。

        #region 获取网络时间
        /// <summary>
        /// 获取中国国家授时中心网络服务器时间发布的当前时间
        /// </summary>
        /// <returns></returns>
        public static DateTime GetChineseDateTime()
        {
            DateTime res = DateTime.MinValue;
            try
            {
                string url = "http://www.time.ac.cn/stime.asp";
                HttpHelper helper = new HttpHelper();
                helper.Encoding = Encoding.Default;
                string html = helper.GetHtml(url);
                string patDt = @"\d{4}年\d{1,2}月\d{1,2}日";
                string patHr = @"hrs\s+=\s+\d{1,2}";
                string patMn = @"min\s+=\s+\d{1,2}";
                string patSc = @"sec\s+=\s+\d{1,2}";
                Regex regDt = new Regex(patDt);
                Regex regHr = new Regex(patHr);
                Regex regMn = new Regex(patMn);
                Regex regSc = new Regex(patSc);

                res = DateTime.Parse(regDt.Match(html).Value);
                int hr = GetInt(regHr.Match(html).Value, false);
                int mn = GetInt(regMn.Match(html).Value, false);
                int sc = GetInt(regSc.Match(html).Value, false);
                res = res.AddHours(hr).AddMinutes(mn).AddSeconds(sc);
            }
            catch { }
            return res;
        }

        /// <summary>
        /// 从指定的字符串中获取整数
        /// </summary>
        /// <param name="origin">原始的字符串</param>
        /// <param name="fullMatch">是否完全匹配,若为false,则返回字符串中的第一个整数数字</param>
        /// <returns>整数数字</returns>
        private static int GetInt(string origin, bool fullMatch)
        {
            if (string.IsNullOrEmpty(origin))
            {
                return 0;
            }
            origin = origin.Trim();
            if (!fullMatch)
            {
                string pat = @"-?\d+";
                Regex reg = new Regex(pat);
                origin = reg.Match(origin.Trim()).Value;
            }
            int res = 0;
            int.TryParse(origin, out res);
            return res;
        }
        #endregion

        #region P/Invoke 设置本地时间

        [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">DateTime对象</param>
        public static void SetLocalTime(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;

            SetLocalTime(ref st);
        }

        #endregion

 本文转自博客园伍华聪的博客,原文链接:时间的处理--与网络时间同步,如需转载请自行联系原博主。

时间: 2024-10-02 12:14:14

时间的处理--与网络时间同步的相关文章

电脑时间不能同步,电脑时间同步出错的解决办法

电脑时间不能同步.电脑时间同步出错的解决步骤: (小窍门:将日期和时间调整为接近当前,将可以避免电脑时间不能同步或进行同步时出错的问题) (在开始下面的设置之前,小编建议将"自动与Internet时间服务器同步"下方的服务器更改为IP:210.72.145.44,这是中国国家授时站的IP地址,同步成功率为99%) 第一步:校准时区,鼠标双击任务栏右下角时间栏或右键单击时间选择"调整日期/时间"-->在弹出的 "日期和时间属性"窗口中选择&q

本人有大量业余时间,寻java网络开发

问题描述 本人有10年的java开发经验,目前有大量的业余时间,求java网络开发谢谢: 解决方案 解决方案二:去猪八戒网找找,解决方案三:我去,10年!10年前,MyEclipse都没出来,果然是高手!解决方案四:先记下,有空联系楼主解决方案五:10年前可以用WSAD,VisualAgeforJava,10年开发的可以加我:3592888解决方案六:10年啊,厉害解决方案七:10年的经验,你现在回什么呢?能够做什么呢??解决方案八:还是利用自己的编程特长来赚钱吧,你可以看看这本书<程序员接单宝

与网络时间同步 设Win7精确时间

有没有发现您电脑上面的时间经常不准确?有没有为经常修改时间而恼火?其实您大可不必,在Windows7中,它自带的与Internet时间服务器同步功能完全可以为我们解决掉这个小麻烦. 如何设置它呢?且看小编为您解决. 单击桌面右下角的时间任务栏,然后点击"更改日期和时间设置-". 在"日期和时间"的设置窗口点击"Internet时间"选项卡,选择"更改设置"按钮. 进入"Internet时间设置"面板后,勾选

营销建议:利用“时间紧急性”提高网络销售量

中介交易 SEO诊断 淘宝客 云主机 技术大厅 对于网络上有关时装.家居用品.旅游和美食等网上交易,消费者会快速.定期或反复进行,而且他们也喜爱这种方式.对于团购或快销网站来说,他们可能会将紧急性作为优先考虑因素,并且作为产品销售的一种策略.即使你不属于这类网站,那也没关系,你同样也可以从这类越来越多的成功网站中借鉴一些经验. 市场研究机构eMarketer最近发布了一项研究,详细描述了这类相对较新的电子商务模式的增长,其中重点突出了电子邮件对促进网站访问量和购买量的重要性.就像这些网站的任何一

Windows 10日期时间不对怎么办?系统时间同步设置

1. 通过以下两种方式打开时间和日期设置. (1)我们按window+r在弹出菜单点击"控制面板-"进入后在控制面板中找到"时钟.语言和区域",如下图所示: (2)然后我们在进入到的时间,弹出的界面,然后单击"更改日期和时间设置",打开就会显示如下效果了: 2.接着我僦可以可以设置了,如我们点击"日期和时间"下面的一个"Internet 时间",点击"更改设置",将"与Inte

Android中实现用命令行同步网络时间_Android

一.简介 Android基于Linux平台的开源手机操作系统. 二.原理 既然是Linux,那就应该支持linux的各种命令行,高度的可配置,但实验发现Android是Google的一个高度阉割版的linux,很多命令都不支持,如rdate命令(网络同步时间命令).既然不支持,那我使他支持不就完了. 三.BusyBox BusyBox 是标准 Linux 工具的一个单个可执行实现.BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大.更复杂的工具,例如 grep.f

Linux下ntpdate命令同步网络时间例子

自己的Linux服务器的时间和PC机上的时间不太对,打log的时间对不上,不太方便调式信息的判断,因此需要同步一下Linux服务器的时间和自己Windows的时间,两者一致,才方便调式的查看呢. 同步网络时间 在Linux下,我们可以使用ntpdate进行网络时间的同步,而不是我们自己去设置时间.这个命令的使用很简单, ntpdate  0.cn.pool.ntp.org 另外网络时间同步和时区是不一样的.你可以选择任何一台网络时间同步服务器来同步你的时间,只要你的时区设置是对的,那么你的Lin

Android中实现用命令行同步网络时间

一.简介 Android基于Linux平台的开源手机操作系统. 二.原理 既然是Linux,那就应该支持linux的各种命令行,高度的可配置,但实验发现Android是Google的一个高度阉割版的linux,很多命令都不支持,如rdate命令(网络同步时间命令).既然不支持,那我使他支持不就完了. 三.BusyBox BusyBox 是标准 Linux 工具的一个单个可执行实现.BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大.更复杂的工具,例如 grep.f

YH中多方法获取网络时间

在做YH维护的时候,偶尔会碰到这样的问题:电脑的非正常关机导致系统时间出错(变为了2002-1-1),从而影响到项目系统的使用.尤其是设计到money的系统,如果时间错误,可能会导致无法想象的后果.所以我们可能需要用系统和网络的双重验证. 通过收集.修改.优化和测试,剔除了一些错误的和速度超慢的,只剩下了4种可行的方案.这些方案中主要有3类: 一.通过向某网站发送请求,获取服务器响应请求的时间 二.获某时间网页的html或xml码,读取其中的时间. 三.通过向某授时服务器发送请求,获取网络时间