我從我的C#應用程序調用了SetSystemTime。但是,如果我將Windows時區設置爲UTC以外的非零偏移量,有時可能會調整系統時鐘,就好像我提供的時間是UTC(即轉換爲本地時間),而其他時間則不是這樣,它只是將時間直接設置爲date
參數。SetSystemTime - UTC或當地時間?
[StructLayout(LayoutKind.Sequential)]
internal struct SystemTime
{
public short Year;
public short Month;
public short DayOfWeek;
public short Day;
public short Hour;
public short Minute;
public short Second;
public short Milliseconds;
}
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool SetSystemTime(ref SystemTime st);
public static bool AdjustSystemClock(DateTime date)
{
SystemTime systemTime = new SystemTime();
systemTime.Year = (short)date.Year;
systemTime.Month = (short)date.Month;
systemTime.Day = (short)date.Day;
systemTime.Hour = (short)date.Hour;
systemTime.Minute = (short)date.Minute;
systemTime.Second = (short)date.Second;
return SetSystemTime(ref systemTime);
}
的區別似乎是:當我使用的是Windows設置時區,然後啓動應用程序,當我打電話SetSystemTime()
它調整,如果它是UTC提供的時間。
但是,當我使用SetDynamicTimeZoneInformation()
函數設置時區時,重新啓動應用程序,然後調用SetSystemTime()
,然後它將時間直接設置爲我提供的時間,而不考慮時區。
這是預期的行爲?如何在設置時區的兩種方法之間獲得一致性?
SetSystemTime()幾乎從不「直接將時間設置爲我提供的時間」。它設置UTC時間。除非您居住在愛爾蘭,位於UTC + 0時區。不完全是祝福。隨機調用SetDynamicTimeZoneInformation()通常是不明智的,除非計算機位於飛機上:)使.NET程序知道時區更改需要重新啓動它(與您一樣)或調用CultureInfo.ClearCachedData + TimeZoneInfo.ClearCachedData。不要這樣做。 –
Windows計算機自動同步他們的時間。使用內置功能不是更安全嗎?您可以更改同步頻率或強制同步[通過設置和Win32tm工具](https://technet.microsoft.com/en-us/windows-server-docs/identity/ad-ds/get-started/windows -time-service/windows-time-service-tools-and-settings) –