【整理】时间的处理--与网络时间同步

时间准确的重要性不言而喻,有时候我们对时间的要求非常严格,有时候也要求不允许用户调整系统时间,有时候。。。等等情况下,我们都需要时间的同步,虽然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

 

 

两步操作就可以搞定时间的同步,测试效果还是不错,不过不建议频繁进行时间的同步处理,间隔一段时间检查一次即可。

如果你有更好的方法,希望大家交流提高。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值