c#修改系统时间的方法

来源:互联网 发布:JS中的属性是什么意思 编辑:程序博客网 时间:2024/06/05 17:35

C#没有提供直接的方法对系统时间进行设定,一般我们只能通过DateTime.Now获取系统时间,但是并不能对这个时间进行修改。这里对了解的主要的两种方式做了个整理,希望对大家有帮助。

方法一,用API函数的方式来修改时间。
首先定义API函数

[csharp] view plaincopy
  1. [StructLayout( LayoutKind.Sequential)]  
  2. public struct SYSTEMTIME  
  3. {  
  4.     public ushort wYear;  
  5.     public ushort wMonth;  
  6.     public ushort wDayOfWeek;  
  7.     public ushort wDay;  
  8.     public ushort wHour;  
  9.     public ushort wMinute;  
  10.     public ushort wSecond;  
  11.     public ushort wMilliseconds;  
  12.   
  13.     public void FromDateTime(DateTime dateTime)  
  14.     {  
  15.         wYear = (ushort)dateTime.Year;  
  16.         wMonth = (ushort)dateTime.Month;  
  17.         wDayOfWeek = (ushort)dateTime.DayOfWeek;  
  18.         wDay = (ushort)dateTime.Day;  
  19.         wHour = (ushort)dateTime.Hour;  
  20.         wMinute = (ushort)dateTime.Minute;  
  21.         wSecond = (ushort)dateTime.Second;  
  22.         wMilliseconds = (ushort)dateTime.Millisecond;  
  23.     }  
  24.   
  25.     public DateTime ToDateTime()  
  26.     {  
  27.         return new DateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond);  
  28.     }  
  29. }  
  30.     //设定,获取系统时间,SetSystemTime()默认设置的为UTC时间,比北京时间少了8个小时。  
  31.     [DllImport("Kernel32.dll")]  
  32.     public static extern bool SetSystemTime(ref SYSTEMTIME time);  
  33.     [DllImport("Kernel32.dll")]  
  34.     public static extern bool SetLocalTime(ref SYSTEMTIME time);  
  35.     [DllImport("Kernel32.dll")]  
  36.     public static extern void GetSystemTime(ref SYSTEMTIME time);  
  37.     [DllImport("Kernel32.dll")]  
  38.     public static extern void GetLocalTime(ref SYSTEMTIME time);  


调用API函数,这里主要要注意SetSystemTime和SetLocalTime,以及GetSystemTime和GetLocalTime的区别,尽量从测试结果中去分析比较。一般情况下我们就用SetLocalTime和GetLocalTime。

[csharp] view plaincopy
  1. {  
  2.      SYSTEMTIME st = new SYSTEMTIME();  
  3.      Win32.GetLocalTime(ref st);  
  4.      System.Diagnostics.Debug.WriteLine("GetLocalTime()");  
  5.      System.Diagnostics.Debug.WriteLine(st.ToDateTime().ToString("yyyy/MM/dd HH:mm:ss"));  
  6.      Win32.GetSystemTime(ref st);  
  7.      System.Diagnostics.Debug.WriteLine("GetSystemTime()");  
  8.      System.Diagnostics.Debug.WriteLine(st.ToDateTime().ToString("yyyy/MM/dd HH:mm:ss"));  
  9.   
  10.      DateTime dt = Convert.ToDateTime("2011/12/12 12:15:20");  
  11.      System.Diagnostics.Debug.WriteLine("test time:2011/12/12 12:15:20");  
  12.      st.FromDateTime(dt);  
  13.      Win32.SetLocalTime(ref st);  
  14.      System.Diagnostics.Debug.WriteLine("SetLocalTime()");  
  15.      System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));  
  16.      Win32.SetSystemTime(ref st);  
  17.      System.Diagnostics.Debug.WriteLine("SetSystemTime()");  
  18.      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脚本的方式来改变系统时间,这种方式对于对批处理命令比较熟的人相当实用。代码如下:

[csharp] view plaincopy
  1. ProcessStartInfo PstartInfoCmd = new ProcessStartInfo();  
  2. PstartInfoCmd.FileName = "cmd.exe";  
  3. PstartInfoCmd.Arguments = "/C date " + createDateTime.ToShortDateString() ;  
  4. PstartInfoCmd.WindowStyle = ProcessWindowStyle.Hidden;  
  5. Process proStep1 = new Process();  
  6. proStep1.StartInfo = PstartInfoCmd;  
  7. proStep1.Start();  

主要用了一句“ date 日期”脚本命令,注意cmd的/C开关,代表的是执行完就关闭cmd窗口,否则如果调用了Process 的WaitForExit()等方法可能会阻塞。

0 0
原创粉丝点击