C#沒有提供直接的方法對系統時間進行設定,一般我們只能通過DateTime.Now擷取系統時間,但是並不能對這個時間進行修改。這裡對瞭解的主要的兩種方式做了個整理,希望對大家有協助。
方法一,用API函數的方式來修改時間。
首先定義API函數
[StructLayout( LayoutKind.Sequential)] public struct SYSTEMTIME { public ushort wYear; public ushort wMonth; public ushort wDayOfWeek; public ushort wDay; public ushort wHour; public ushort wMinute; public ushort wSecond; public ushort wMilliseconds; public void FromDateTime(DateTime dateTime) { wYear = (ushort)dateTime.Year; wMonth = (ushort)dateTime.Month; wDayOfWeek = (ushort)dateTime.DayOfWeek; wDay = (ushort)dateTime.Day; wHour = (ushort)dateTime.Hour; wMinute = (ushort)dateTime.Minute; wSecond = (ushort)dateTime.Second; wMilliseconds = (ushort)dateTime.Millisecond; } public DateTime ToDateTime() { return new DateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond); } } //設定,擷取系統時間,SetSystemTime()預設設定的為UTC時間,比北京時間少了8個小時。 [DllImport("Kernel32.dll")] public static extern bool SetSystemTime(ref SYSTEMTIME time); [DllImport("Kernel32.dll")] public static extern bool SetLocalTime(ref SYSTEMTIME time); [DllImport("Kernel32.dll")] public static extern void GetSystemTime(ref SYSTEMTIME time); [DllImport("Kernel32.dll")] public static extern void GetLocalTime(ref SYSTEMTIME time);
調用API函數,這裡主要要注意SetSystemTime和SetLocalTime,以及GetSystemTime和GetLocalTime的區別,盡量從測試結果中去分析比較。一般情況下我們就用SetLocalTime和GetLocalTime。
{ SYSTEMTIME st = new SYSTEMTIME(); Win32.GetLocalTime(ref st); System.Diagnostics.Debug.WriteLine("GetLocalTime()"); System.Diagnostics.Debug.WriteLine(st.ToDateTime().ToString("yyyy/MM/dd HH:mm:ss")); Win32.GetSystemTime(ref st); System.Diagnostics.Debug.WriteLine("GetSystemTime()"); System.Diagnostics.Debug.WriteLine(st.ToDateTime().ToString("yyyy/MM/dd HH:mm:ss")); DateTime dt = Convert.ToDateTime("2011/12/12 12:15:20"); System.Diagnostics.Debug.WriteLine("test time:2011/12/12 12:15:20"); st.FromDateTime(dt); Win32.SetLocalTime(ref st); System.Diagnostics.Debug.WriteLine("SetLocalTime()"); System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")); Win32.SetSystemTime(ref st); System.Diagnostics.Debug.WriteLine("SetSystemTime()"); System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
測試結果:
GetLocalTime()
2011/12/12 20:16:00
GetSystemTime()
2011/12/12 12:16:00 //擷取的時候比北京時間少8小時
test time:2011/12/12 12:15:20
SetLocalTime()
2011/12/12 12:15:20
SetSystemTime() //設定的時候比北京時間多8小時
2011/12/12 20:15:20
方法二,cmd命令的方式
這種方式可以用Process類調用cmd,以執行Window指令碼的方式來改變系統時間,這種方式對於對批處理命令比較熟的人相當實用。代碼如下:
ProcessStartInfo PstartInfoCmd = new ProcessStartInfo(); PstartInfoCmd.FileName = "cmd.exe"; PstartInfoCmd.Arguments = "/C date " + createDateTime.ToShortDateString() ; PstartInfoCmd.WindowStyle = ProcessWindowStyle.Hidden; Process proStep1 = new Process(); proStep1.StartInfo = PstartInfoCmd; proStep1.Start();
主要用了一句“ date 日期”指令碼命令,注意cmd的/C開關,代表的是執行完就關閉cmd視窗,否則如果調用了Process 的WaitForExit()等方法可能會阻塞。
來過就留下點腳印吧,太冷清了