如何使用C#将Windows系统时钟设置为正确的本地时间?
您需要从Windows API调用SetLocalTime
函数 。 在C#中声明它是这样的:
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] internal static extern bool SetLocalTime(ref SYSTEMTIME lpSystemTime); [StructLayout(LayoutKind.Sequential)] internal struct SYSTEMTIME { public ushort wYear; public ushort wMonth; public ushort wDayOfWeek; // ignored for the SetLocalTime function public ushort wDay; public ushort wHour; public ushort wMinute; public ushort wSecond; public ushort wMilliseconds; }
要设置时间,只需使用适当的值初始化SYSTEMTIME
结构的实例,然后调用该函数。 示例代码:
SYSTEMTIME time = new SYSTEMTIME(); time.wDay = 1; time.wMonth = 5; time.wYear = 2011; time.wHour = 12; time.wMinute = 15; if (!SetLocalTime(ref time)) { // The native function call failed, so throw an exception throw new Win32Exception(Marshal.GetLastWin32Error()); }
但是请注意,调用进程必须具有适当的权限才能调用此函数。 在Windows Vista和更高版本中,这意味着您将不得不请求进程提升。
或者,您可以使用SetSystemTime
函数 ,该函数允许您使用UTC(协调世界时)来设置时间。 使用相同的SYSTEMTIME
结构,并且以相同的方式调用这两个函数。
.NET不公开一个函数,但可以使用Win32 API SetSystemTime (在kernel32.dll中)方法。 要获得UTC时间,您应该使用NTP协议客户端 ,然后根据您的区域设置将该时间调整到当地时间。
public struct SYSTEMTIME { public ushort wYear,wMonth,wDayOfWeek,wDay,wHour,wMinute,wSecond,wMilliseconds; } [DllImport("kernel32.dll")] public extern static uint SetSystemTime(ref SYSTEMTIME lpSystemTime); SYSTEMTIME systime = new SYSTEMTIME(); systime = ... // Set the UTC time here SetSystemTime(ref systime);
这里有一些关于如何做到这一点的文章,完成查询原子钟的正确时间。
要解决SE_SYSTEMTIME_NAME权限问题,请尝试创建计划任务来运行您的应用程序,并启用“以最高权限运行”。