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

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

 

 

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

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

你可能感兴趣的:(时间同步)