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()等方法可能会阻塞。
来过就留下点脚印吧,太冷清了