2017-03-22 164 views
3

我從我的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(),然後它將時間直接設置爲我提供的時間,而不考慮時區。

這是預期的行爲?如何在設置時區的兩種方法之間獲得一致性?

+0

SetSystemTime()幾乎從不「直接將時間設置爲我提供的時間」。它設置UTC時間。除非您居住在愛爾蘭,位於UTC + 0時區。不完全是祝福。隨機調用SetDynamicTimeZoneInformation()通常是不明智的,除非計算機位於飛機上:)使.NET程序知道時區更改需要重新啓動它(與您一樣)或調用CultureInfo.ClearCachedData + TimeZoneInfo.ClearCachedData。不要這樣做。 –

+0

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) –

回答

1

我相信我發現了這個問題。

事實證明,編寫代碼位SetDynamicTimeZoneInformation()忽略設置Bias屬性的人。

因此,設置的時區信息的UTC偏移量爲零,因此不會進行調整。

+0

而不是自己設置時間,爲什麼不讓操作系統自動執行它?域計算機自動與域控制器同步。獨立計算機(或DC)與日期和時間設置中指定的時間服務器自動同步 –

+0

@PanagiotisKanavos - 我不是該應用程序的原始開發人員,但他們顯然有這樣做的充分理由。首先,它在專用設備(Windows Embedded 7)上,它不提供用戶訪問主Windows操作系統的權限。 (外殼應用程序在打開設備時加載此應用程序,然後在退出應用程序時關閉設備) – colmde

+0

Windows Embedded上也提供時間同步。檢查這個SO問題:[在Windows嵌入式標準通過批處理或類似設置互聯網時間服務器](http://stackoverflow.com/questions/34016933/setting-internet-time-server-on-windows-embedded-standard-through-分批或-simil)。沒有同步時鐘,您不能使用SSL或任何其他形式的檢查過期數據包的加密方式。這包括與域控制器的溝通。 –