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. 【DFS】NYOJ-82 迷宫寻宝(一)-条件迷宫问题

    [题目链接:NYOJ-82] #include<iostream> #include<cstring> using namespace std; struct node{ in ...

  2. Android-AnimationDrawable(三)运行的几种方式

    项目开发用到了AnimationDrawable,调用start后没有运行,很纳闷.google搜了下.记录一下. 这个AnimationDrawable.start不能直接写在onClick,onS ...

  3. vim简单使用教程

    vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的.下面的文章翻译自<Learn Vim Progress ...

  4. spring中的BeanFactory与ApplicationContext的作用和区别?

    BeanFactory类关系继承图 1. BeanFactory类结构体系: BeanFactory接口及其子类定义了Spring IoC容器体系结构,由于BeanFactory体系非常的庞大和复杂, ...

  5. Number Sequence(KMP,判断子串 模板)

    题意: 给两数组,求一个是否是另一个的子数组,若是返回匹配的首位置 分析: KMP 入门 //扫描字符串A,并更新可以匹配到B的什么位置. #include <map> #include ...

  6. Selenium IDE测试创建

    Selenium IDE 测试创建 涉及使用IDE Selenium创建测试,如下面的步骤 记录和测试添加命令 保存测试记录 保存测试程序 执行测试记录 在测试中记录和添加命令 为了演示目的,我们将利 ...

  7. 【原】Storm分布式RPC

    5. Storm高级篇 序列化 分布式RPC High level overview LinearDRPCTopologyBuilder Local mode DRPC Remote mode DRP ...

  8. hadoop 权限错误 Permission denied: user=root, access=WRITE, inode="/":hdfs:super

    关于不能执行Hadoop命令 并报权限问题执行错误1.Permission denied: user=root, access=WRITE, inode="/":hdfs:supe ...

  9. pycharm 源文件 编码格式

    pycharm 4.5.3 版本 修改项目的编码 按如下操作:菜单 File-Settings-Editor-File Encodings 将IDE Encoding 和 Project Encodi ...

  10. Codeforces Round #362

    A - Pineapple Incident #pragma comment(linker, "/STACK:102c000000,102c000000") #include &l ...