2009-02-02 17:48 8226人阅读 评论(2) 收藏 举报

需要用到的名空间

  1. using System.Net;
  2. using System.Net.Sockets;
  3. using System.Runtime.InteropServices;

建立一个结构

  1. public struct SystemTime
  2. {
  3. public ushort wYear;
  4. public ushort wMonth;
  5. public ushort wDayOfWeek;
  6. public ushort wDay;
  7. public ushort wHour;
  8. public ushort wMinute;
  9. public ushort wSecond;
  10. public ushort wMilliseconds;
  11. /// <summary>
  12. /// 从System.DateTime转换。
  13. /// </summary>
  14. /// <param name="time">System.DateTime类型的时间。</param>
  15. public void FromDateTime(DateTime time)
  16. {
  17. wYear = (ushort)time.Year;
  18. wMonth = (ushort)time.Month;
  19. wDayOfWeek = (ushort)time.DayOfWeek;
  20. wDay = (ushort)time.Day;
  21. wHour = (ushort)time.Hour;
  22. wMinute = (ushort)time.Minute;
  23. wSecond = (ushort)time.Second;
  24. wMilliseconds = (ushort)time.Millisecond;
  25. }
  26. /// <summary>
  27. /// 转换为System.DateTime类型。
  28. /// </summary>
  29. /// <returns></returns>
  30. public DateTime ToDateTime()
  31. {
  32. return new DateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliseconds);
  33. }
  34. /// <summary>
  35. /// 静态方法。转换为System.DateTime类型。
  36. /// </summary>
  37. /// <param name="time">SYSTEMTIME类型的时间。</param>
  38. /// <returns></returns>
  39. public static DateTime ToDateTime(SystemTime time)
  40. {
  41. return time.ToDateTime();
  42. }
  43. }

要用到Windows的API函数来设置系统时间

  1. public class Win32API
  2. {
  3. [DllImport("Kernel32.dll")]
  4. public static extern bool SetLocalTime(ref SystemTime Time);
  5. [DllImport("Kernel32.dll")]
  6. public static extern void GetLocalTime(ref SystemTime Time);
  7. }

用Socket获取Internet时间服务器上的时间

  1. public void SetInternetTime()
  2. {
  3. // 记录开始的时间
  4. DateTime startDT = DateTime.Now;
  5. //建立IPAddress对象与端口,创建IPEndPoint节点:
  6. int port = 13;
  7. string[] whost = { "5time.nist.gov", "time-nw.nist.gov", "time-a.nist.gov", "time-b.nist.gov", "tick.mit.edu", "time.windows.com", "clock.sgi.com" };
  8. IPHostEntry iphostinfo;
  9. IPAddress ip;
  10. IPEndPoint ipe;
  11. Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建Socket
  12. c.ReceiveTimeout = 10 * 1000;//设置超时时间
  13. string sEX = "";// 接受错误信息
  14. // 遍历时间服务器列表
  15. foreach (string strHost in whost)
  16. {
  17. try
  18. {
  19. iphostinfo = Dns.GetHostEntry(strHost);
  20. ip = iphostinfo.AddressList[0];
  21. ipe = new IPEndPoint(ip, port);
  22. c.Connect(ipe);//连接到服务器
  23. if (c.Connected) break;// 如果连接到服务器就跳出
  24. }
  25. catch (Exception ex)
  26. {
  27. sEX = ex.Message;
  28. }
  29. }
  30. if (!c.Connected)
  31. {
  32. MessageBox.Show("时间服务器连接失败!/r错误信息:" + sEX, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  33. return;
  34. }
  35. //SOCKET同步接受数据
  36. byte[] RecvBuffer = new byte[1024];
  37. int nBytes, nTotalBytes = 0;
  38. StringBuilder sb = new StringBuilder();
  39. System.Text.Encoding myE = Encoding.UTF8;
  40. while ((nBytes = c.Receive(RecvBuffer, 0, 1024, SocketFlags.None)) > 0)
  41. {
  42. nTotalBytes += nBytes;
  43. sb.Append(myE.GetString(RecvBuffer, 0, nBytes));
  44. }
  45. //关闭连接
  46. c.Close();
  47. string[] o = sb.ToString().Split(' '); // 打断字符串
  48. textBox1.Text = sb.ToString();
  49. TimeSpan k = new TimeSpan();
  50. k = (TimeSpan)(DateTime.Now - startDT);// 得到开始到现在所消耗的时间
  51. DateTime SetDT = Convert.ToDateTime(o[1] + " " + o[2]).Subtract(-k);// 减去中途消耗的时间
  52. //处置北京时间 +8时
  53. SetDT = SetDT.AddHours(8);
  54. //转换System.DateTime到SystemTime
  55. SystemTime st = new SystemTime();
  56. st.FromDateTime(SetDT);
  57. //调用Win32 API设置系统时间
  58. Win32API.SetLocalTime(ref st);
  59. MessageBox.Show("时间已同步", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  60. }

这个东西是收集网上的一些做法再修改了一下

用vs2008+windows xp sp2测试通过

但是始终会有±1秒的误差,但大部分误差在1秒以下,尚可接受

使用的名空间包括vs自己添加的,windows Form中用到的那部分

如果换了环境,可作相应修改

转载:http://blog.csdn.net/zhengxia19/article/details/3858910

c# Internet时间服务器同步的更多相关文章

  1. VC自动与Internet时间服务器同步更新

    在VCKBASE.CSDN里挖了许久的坟,才找到一些有点用的资料,最后自己整理出这样的个函数,方面VC实现时间同步,多的不说,自己看源码,根据自己的需要可以适当修改源码: #include <W ...

  2. 小凡的Linux主机与时间服务器同步记录

    小凡的Linux主机与时间服务器同步记录 导读 我们新安装的Linux主机,如果没有做与互联网服务器时间同步的处理的话,当我们使用date命令的时候,我们就看不到当前的时间,只能看到过去的时间.在我们 ...

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

    在一些大公司经常出现这样一个情况:公司或一些机关单位的内部业务系统的应用服务器以及数据都是做的多机集群部署而且基本都是linux系统,而且都是内部网,不与外网通讯的.这样经常就会出现一个情况,我发送任 ...

  4. 自动与因特网时间服务器同步 NTP 服务器 pool.ntp.org, 120.24.166.46 端口 123

    自动与因特网时间服务器同步   NTP 服务器 pool.ntp.org 海康提供的NTP服务器   120.24.166.46     端口  123

  5. centos下部署NTP时间服务器同步环境记录

    1)服务端部署 安装所需软件包 [root@test ~]# yum -y install ntp ntpdate 服务端自己先手工同步一次时间. [root@test ~]# ntpdate ntp ...

  6. Linux基础命令---ntpstat显示时间服务器同步

    ntpstat ntpstat指令用于显示本机上一次和服务器同步时间的情况. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora.   1.语法 ntpstat   2 ...

  7. 分享淘宝时间服务器同步时间接口api和苏宁时间服务器接口api

    最近要开发一款抢购秒杀的小工具,需要同步系统时间,这里分享两个时间服务器接口api给大家: 1.淘宝时间服务器时间接口 http://api.m.taobao.com/rest/api3.do?api ...

  8. chronyd时间服务器同步时间配置

    chrony是两个用来维持计算机系统时钟准确性的程序,这两个程序命名为chronyd和chronyc. chronyd是一个在系统后台运行的守护进程.他根据网络上其他时间服务器时间来测量本机时间的偏移 ...

  9. linux下自动同步internet时间

    linux下很简单直接一句即可: ntpdate time.nist.gov ntp后面参数为internet时间服务器url或ip即可. 但是ntpdate命令需要root特权,如果做成自动运行每次 ...

随机推荐

  1. tomcat启动中提示 - consider increasing the maximum size of the cache

    tomcat启动过程中提示: org.apache.catalina.webresources.Cache.getResource Unable to add the resource at xxx ...

  2. UVA 10735 Euler Circuit 混合图的欧拉回路(最大流,fluery算法)

    题意:给一个图,图中有部分是向边,部分是无向边,要求判断是否存在欧拉回路,若存在,输出路径. 分析:欧拉回路的定义是,从某个点出发,每条边经过一次之后恰好回到出发点. 无向边同样只能走一次,只是不限制 ...

  3. BrowserSync,调试利器--自动刷新(转

    ---恢复内容开始--- 请想象这样一个场面:你开着两个显示器,一边是IDE里的代码,另一边是浏览器里的你正在开发的应用.此时桌上还放着你的手机,手机里也是这个开发中的应用.然后,你新写了一小段代码, ...

  4. zoj 2027 Travelling Fee

    // 题意 : 一个人要去旅行 给你起点和终点 求最少花费 其中花费为经过路径的总费用减去该路径的中的最大花费段// 直接搜索 稍微加了个剪枝 主要是数据规模小#include <iostrea ...

  5. 【转】如何在IOS中使用3D UI - CALayer的透视投影

    原文网址:http://www.tairan.com/archives/2041/ 例子代码可以在 http://www.tairan.com/thread-3607-1-1.html 下载 iOS的 ...

  6. POJ 1080 Human Gene Functions

    题意:给两个DNA序列,在这两个DNA序列中插入若干个'-',使两段序列长度相等,对应位置的两个符号的得分规则给出,求最高得分. 解法:dp.dp[i][j]表示第一个字符串s1的前i个字符和第二个字 ...

  7. hdu 5407 CRB and Candies(组合数+最小公倍数+素数表+逆元)2015 Multi-University Training Contest 10

    题意: 输入n,求c(n,0)到c(n,n)的所有组合数的最小公倍数. 输入: 首行输入整数t,表示共有t组测试样例. 每组测试样例包含一个正整数n(1<=n<=1e6). 输出: 输出结 ...

  8. [转] AE之分级颜色专题图渲染

    原文 AE之分级颜色专题图渲染 参考代码1 private void 分级渲染ToolStripMenuItem_Click(object sender, EventArgs e) { //值分级 I ...

  9. mybatis Mapper XML 文件

    MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% ...

  10. storm入门教程 第一章 前言[转]

    1.1   实时流计算 互联网从诞生的第一时间起,对世界的最大的改变就是让信息能够实时交互,从而大大加速了各个环节的效率.正因为大家对信息实时响应.实时交互的需求,软件行业除了个人操作系统之外,数据库 ...