注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

TERONY的博客

Still Achieving.

 
 
 

日志

 
 

sleepless in c#: 网络授时  

2011-09-23 19:54:20|  分类: Profession |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C#同步网络时间,代码如下:

using System;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;

namespace SyncTime
{
    /// <summary>
    /// 系统时间结构体
    /// </summary>
    public struct SystemTime
    {
        public ushort MyYear;
        public ushort MyMonth; 
        public ushort MyDayOfWeek; 
        public ushort MyDay; 
        public ushort MyHour; 
        public ushort MyMinute;
        public ushort MySecond;
        public ushort MyMillisecond;

        //DateTime转换为SystemTime
        public void FromDateTime(DateTime time)
        {
            MyYear = (ushort)time.Year;
            MyMonth = (ushort)time.Month;
            MyDayOfWeek = (ushort)time.DayOfWeek;
            MyDay = (ushort)time.Day;
            MyHour = (ushort)time.Hour;
            MyMinute = (ushort)time.Minute;
            MySecond = (ushort)time.Second;
            MyMillisecond = (ushort)time.Millisecond;
        }

        //SysteTime转换为DateTime
        public DateTime ToDateTime()
        {
            return new DateTime(MyYear, MyMonth, MyDay, MyHour, MyMinute, MySecond);
        }

        //静态方法:将指定的SystemTime转换为DateTime
        public static DateTime ToDateTime(SystemTime time)
        {
            return time.ToDateTime();
        }
    }

    /// <summary>
    /// Win32 API函数设置和获取当前系统时间
    /// </summary>
    public class Win32API
    {
        [DllImport("Kernel32.dll")]
        public static extern bool SetLocalTime(ref SystemTime time);
        [DllImport("Kernel32.dll")]
        public static extern void GetLocalTime(ref SystemTime time);
    }

    class Program
    {
        static void Main(string[] args)
        {
            //授时服务器列表(数组)
            string[] TimeHost = {"time-nw.nist.gov", "ntp3.fau.de", "time-nw.nist.gov", "time-a.nist.gov", "time-b.nist.gov"};
            Console.WriteLine("【授时服务器客户端程序.汉唐计算机软件工作室.】");
            Console.WriteLine("连接到授时服务器......");

            Program P = new Program();
            int HostIndex = 0;
            while (P.SyncInternetTime(TimeHost[HostIndex]) > 0)
            {
                HostIndex++;
                if (HostIndex >= TimeHost.Length)
                    HostIndex = 0;
            }

            Console.WriteLine("授时完成,按任意键退出.");
            Console.ReadLine();
            return;
        }

        /// <summary>
        /// 从互联网服务器上获取时间
        /// 同步本地计算机时间
        /// 返回值为整型:0为正常,大于0为异常.
        /// </summary>
        public int SyncInternetTime(string timeHost)
        {
            try
            {
                TcpClient TC = new TcpClient();
                //连接到国内授时服务器(总是出错,所以注释掉)
                //TC.Connect("www.time.ac.cn ", 37);
                TC.Connect(timeHost, 37);
               
                NetworkStream NS;
                //读取TcpSocket返回的数据流
                NS = TC.GetStream(); //读取数据流

                byte[] Buf = new byte[4];
                //把数据存到数组中
                NS.Read(Buf, 0, 4); 

                uint LocalSeconds;
                //把服务器返回数据转换成1900/1/1 UTC 到现在所经过的秒数
                LocalSeconds = ((uint)Buf[0] << 24) + ((uint)Buf[1] << 16) + ((uint)Buf[2] << 8) + (uint)Buf[3];

                //初始化本地时间对象为1900/1/1 0时0分0秒0毫秒
                DateTime DT = new DateTime(1900, 1, 1, 0, 0, 0, 0);
                //加上至今所经过的秒数获得当前时间
                DT = DT.AddSeconds(LocalSeconds).ToLocalTime();
                //在控制台显示出时间
                Console.WriteLine(DT.ToLongDateString() + " " + DT.ToLongTimeString());

                //系统时间对象
                SystemTime ST = new SystemTime();
                //DateTime转换为SysteTime
                ST.FromDateTime(DT);

                //修改系统时间
                Win32API.SetLocalTime(ref ST);
                return 0;
            }
            catch (SocketException se)
            {
                Console.WriteLine(se.Message);
                return 1001;
            }
        }
    }
}

上述代码在VS2010中运行成功,需要的童鞋可以自己编译。

补充说明:

1)结构体中重载的ToDateTime方法并没有用到;

2)Win32 API函数GetLocalTime并没有用到,如需要可以获得本机时间;

谴责:

自从国家授时中心退出自己的授时客户端之后,便“封闭”了其它程序的连接,小农思想,谴责!  

  评论这张
 
阅读(99)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017