如何使用C#以编程方式更改本地系统的日期和时间?
这是我找到答案的地方.
我在这里重新发布它以提高清晰度.
定义这个结构:
[StructLayout(LayoutKind.Sequential)] public struct SYSTEMTIME { public short wYear; public short wMonth; public short wDayOfWeek; public short wDay; public short wHour; public short wMinute; public short wSecond; public short wMilliseconds; }
将以下extern
方法添加到您的类:
[DllImport("kernel32.dll", SetLastError = true)] public static extern bool SetSystemTime(ref SYSTEMTIME st);
然后使用结构的实例调用该方法,如下所示:
SYSTEMTIME st = new SYSTEMTIME(); st.wYear = 2009; // must be short st.wMonth = 1; st.wDay = 1; st.wHour = 0; st.wMinute = 0; st.wSecond = 0; SetSystemTime(ref st); // invoke this method.
您可以使用对DOS命令的调用,但是在Windows dll中调用该函数是一种更好的方法.
public struct SystemTime { public ushort Year; public ushort Month; public ushort DayOfWeek; public ushort Day; public ushort Hour; public ushort Minute; public ushort Second; public ushort Millisecond; }; [DllImport("kernel32.dll", EntryPoint = "GetSystemTime", SetLastError = true)] public extern static void Win32GetSystemTime(ref SystemTime sysTime); [DllImport("kernel32.dll", EntryPoint = "SetSystemTime", SetLastError = true)] public extern static bool Win32SetSystemTime(ref SystemTime sysTime); private void button1_Click(object sender, EventArgs e) { // Set system date and time SystemTime updatedTime = new SystemTime(); updatedTime.Year = (ushort)2009; updatedTime.Month = (ushort)3; updatedTime.Day = (ushort)16; updatedTime.Hour = (ushort)10; updatedTime.Minute = (ushort)0; updatedTime.Second = (ushort)0; // Call the unmanaged function that sets the new date and time instantly Win32SetSystemTime(ref updatedTime); }
很多很棒的观点和方法已经在这里,但是这里有一些目前被遗漏的规范,我觉得可能会绊倒并迷惑一些人.
在Windows Vista,7,8 OS上,这将需要 UAC提示,以获得成功执行该SetSystemTime
功能所需的管理权限.原因是调用进程需要SE_SYSTEMTIME_NAME权限.
该SetSystemTime
函数期望SYSTEMTIME
协调世界时(UTC)中的结构.否则它将无法正常工作.
根据您获取DateTime
值的位置/方式,最好ToUniversalTime()
在SYSTEMTIME
结构中设置相应的值之前安全地使用它.
代码示例:
DateTime tempDateTime = GetDateTimeFromSomeService(); DateTime dateTime = tempDateTime.ToUniversalTime(); SYSTEMTIME st = new SYSTEMTIME(); // All of these must be short st.wYear = (short)dateTime.Year; st.wMonth = (short)dateTime.Month; st.wDay = (short)dateTime.Day; st.wHour = (short)dateTime.Hour; st.wMinute = (short)dateTime.Minute; st.wSecond = (short)dateTime.Second; // invoke the SetSystemTime method now SetSystemTime(ref st);
PInvoke调用Win32 API SetSystemTime,(示例)
具有WMI类Win32_OperatingSystem的System.Management类,并在该类上调用SetDateTime.
两者都要求调用者已被授予SeSystemTimePrivilege并且已启用此权限.
使用此功能更改系统时间(在窗口8中测试)
void setDate(string dateInYourSystemFormat) { var proc = new System.Diagnostics.ProcessStartInfo(); proc.UseShellExecute = true; proc.WorkingDirectory = @"C:\Windows\System32"; proc.CreateNoWindow = true; proc.FileName = @"C:\Windows\System32\cmd.exe"; proc.Verb = "runas"; proc.Arguments = "/C date " + dateInYourSystemFormat; try { System.Diagnostics.Process.Start(proc); } catch { MessageBox.Show("Error to change time of your system"); Application.ExitThread(); } } void setTime(string timeInYourSystemFormat) { var proc = new System.Diagnostics.ProcessStartInfo(); proc.UseShellExecute = true; proc.WorkingDirectory = @"C:\Windows\System32"; proc.CreateNoWindow = true; proc.FileName = @"C:\Windows\System32\cmd.exe"; proc.Verb = "runas"; proc.Arguments = "/C time " + timeInYourSystemFormat; try { System.Diagnostics.Process.Start(proc); } catch { MessageBox.Show("Error to change time of your system"); Application.ExitThread(); } }
示例: 调用表单 setDate的加载方法("5-6-92"); setTime("2:4:5 AM");