在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(); } }