• 使用C#实现网络时间同步功能


    在windows server系列的操作性中,存在一个同步时间的服务器,可惜很多服务器都禁用了这个功能。在日常自己的电脑上也会出现时间和标准时间不一致的问题。既然自己是学编程的,那么就自己动手丰衣足食吧。

    下载是通过获取网络标准时间的源码:

    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
    using System.IO;  
    using System.Net;  
    using System.Net.Sockets;  
    using System.Text.RegularExpressions;  
    using System.Runtime.InteropServices;
    using System.Runtime;    
    
    
    
        /// <summary>  
        /// 网络时间  
        /// </summary>  
        public class NetTime
        {
           
            /// <summary>  
            /// 获取标准北京时间,读取http://www.beijing-time.org/time.asp  
            /// </summary>  
            /// <returns>返回网络时间</returns>  
            public DateTime GetBeijingTime()
            {
             
                DateTime dt;
                WebRequest wrt = null;
                WebResponse wrp = null;
                try
                {
                    wrt = WebRequest.Create("http://www.beijing-time.org/time.asp");
                    wrp = wrt.GetResponse();
    
                    string html = string.Empty;
                    using (Stream stream = wrp.GetResponseStream())
                    {
                        using (StreamReader sr = new StreamReader(stream, Encoding.UTF8))
                        {
                            html = sr.ReadToEnd();
                        }
                    }
    
                    string[] tempArray = html.Split(';');
                    for (int i = 0; i < tempArray.Length; i++)
                    {
                        tempArray[i] = tempArray[i].Replace("\r\n", "");
                    }
    
                    string year = tempArray[1].Split('=')[1];
                    string month = tempArray[2].Split('=')[1];
                    string day = tempArray[3].Split('=')[1];
                    string hour = tempArray[5].Split('=')[1];
                    string minite = tempArray[6].Split('=')[1];
                    string second = tempArray[7].Split('=')[1];
    
                    dt = DateTime.Parse(year + "-" + month + "-" + day + " " + hour + ":" + minite + ":" + second);
                }
                catch (WebException)
                {
                    return DateTime.Parse("2011-1-1");
                }
                catch (Exception)
                {
                    return DateTime.Parse("2011-1-1");
                }
                finally
                {
                    if (wrp != null)
                        wrp.Close();
                    if (wrt != null)
                        wrt.Abort();
                }
                return dt;
    
            }
        }

    获取网络时间,返回一个DateTime对象,然后传给设置系统时间的方法,修改系统时间。下面是设置系统时间的代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Text.RegularExpressions;
    using System.Runtime.InteropServices;
    using System.Runtime;    
    
    
        /// <summary>
        /// 更新系统时间
        /// </summary>
        public class UpdateTime
        {
            //设置系统时间的API函数
            [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">需要设置的时间</param>
            /// <returns>返回系统时间设置状态,true为成功,false为失败</returns>
            public static bool SetDate(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;
                bool rt = SetLocalTime(ref st);
                return rt;
            }
        }

    需要注意的时,在win8系统上需要以管理员身份来运行程序,否则是无法设置系统时间的。下面这段代码可以设置让程序默认以管理员身份运行:

    static void Main(string[] Args)
            {
                /**
                 * 当前用户是管理员的时候,直接启动应用程序
                 * 如果不是管理员,则使用启动对象启动程序,以确保使用管理员身份运行
                 */
                //获得当前登录的Windows用户标示
                System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
                //创建Windows用户主题
                Application.EnableVisualStyles();
    
                System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
                //判断当前登录用户是否为管理员
                if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
                {
                    //如果是管理员,则直接运行
    
                    Application.EnableVisualStyles();
                    Application.Run(new Form1());
                }
                else
                {
                    //创建启动对象
                    System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                    //设置运行文件
                    startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
                    //设置启动参数
                    startInfo.Arguments = String.Join(" ", Args);
                    //设置启动动作,确保以管理员身份运行
                    startInfo.Verb = "runas";
                    //如果不是管理员,则启动UAC
                    System.Diagnostics.Process.Start(startInfo);
                    //退出
                    System.Windows.Forms.Application.Exit();
                }
            } 
  • 相关阅读:
    [转] css选择器中:first-child与:first-of-type的区别
    [转] Javascript中理解发布--订阅模式
    [转] 浅析JavaScript设计模式——发布-订阅/观察者模式
    [转] linux学习第四十四篇:Nginx安装,Nginx默认虚拟主机,Nginx域名重定向
    [转] meta标签的作用及整理
    [转] 安装npm全局包提示权限不够
    [转] UniCode编码表
    Unicode字符编码表
    [转] Lodash常用API笔记
    [转] JavaScript 之 ArrayBuffer
  • 原文地址:https://www.cnblogs.com/lifeil/p/2917999.html
Copyright © 2020-2023  润新知