主代码: public class frmMain : System.Windows.Forms.Form { ////省略自动生成的代码 ////……………
Thread thrTimeSync; private void TimeSyncProc() { while(true) { TcpClient c = new TcpClient(); c.Connect("www.time.ac.cn", 37); //连接到国内授时服务器
NetworkStream s; s = c.GetStream(); //读取数据流 c.Close();
byte []buf = new byte[4]; s.Read(buf,0,4); //把数据存到数组中
uint lTime;
//把服务器返回数据转换成1900/1/1 UTC 到现在所经过的秒数 lTime = ((uint)buf[0] << 24) + ((uint)buf[1] << 16) + ((uint)buf[2] << 8) + (uint)buf[3];
//得到真实的本地时间 System.DateTime datetime = new DateTime(1900,1,1,0,0,0,0); datetime = datetime.AddSeconds(lTime).ToLocalTime();
//这里可以显示出时间。有兴趣的朋友可以取消注释看一下效果。 //MessageBox.Show(datetime.ToLongDateString() + datetime.ToLongTimeString());
//修改系统时间 SystemTime sysDateTime = new SystemTime();
sysDateTime.wYear = (short)datetime.Year; sysDateTime.wDay = (short)datetime.Day; sysDateTime.wMonth = (short)datetime.Month;
sysDateTime.wHour = (short)datetime.Hour; sysDateTime.wMinute = (short)datetime.Minute; sysDateTime.wSecond = (short)datetime.Second;
Win32API.SetLocalTime(ref sysDateTime);
System.Threading.Thread.Sleep(1 * 1000); } }
private void frmMain_Load(object sender, System.EventArgs e) { thrTimeSync = new Thread(new ThreadStart(TimeSyncProc)); thrTimeSync.Start(); }
private void frmMain_Closing(object sender, System.ComponentModel.CancelEventArgs e) { thrTimeSync.Abort(); }
} 到此为止,本文的内容基本讲完了。但有的朋友或许会问,这种方法的精确度如何保证?网络速度难道不会造成误差吗?没错,这正是本文所讲方法的局限性。使用这种方法,由于网络延迟带来的误差是难以消除的,因此只能用在要求不高的场所。在对精度要求很高的情况中,可以使用Simple Network Time协议(RFC1769, http://rfc.linuxforum.net/rfc1769.txt)来精确授时。其大体原理是数据包在经过服务器时都记录时间损失,最终通过调整来达到最小误差。 源程序可以在 这里 下载。
|