2013-11-28 77 views
3

我正在從WPF應用程序中更改系統時區。要做到這一點,我使用了我在本網站上找到的非託管代碼:changing time zones。它確實改變了我的時區。然而,當我點擊窗口時鐘,我看到一條消息:「您當前的時區無法識別,請使用下面的鏈接選擇一個有效的時區。」我可以想象有什麼地方有些微差別。我已經分析過一個時區 - 它是如何在程序化變更之前和之後呈現的。如何以編程方式更改系統時區

BEFORE:

BaseUtcOffset: 4:00:00:00 
Daylight Name: "Arabian Daylight Time" 
Display Name: "(UTC +4:00) Abu Dhabi, Muscat" 
Id: "Arabian Daylight Time" 
Standard Name: "Arabian Daylight Time" 
SupportsDaylightSavingTime: false 

AFTER:

BaseUtcOffset: -4:00:00:00 
Daylight Name: "" 
Display Name: "Arabian Daylight Time" 
Id: "Arabian Daylight Time" 
Standard Name: "Arabian Daylight Time" 
SupportsDaylightSavingTime: false 

我發現沒有辦法設置 「顯示名稱」 使用TIME_ZONE_INFORMATION。因此,當用戶使用Windows設置手動更改時,它被稱爲「(UTC + 4:00)阿布扎比,馬斯喀特」,現在它被稱爲「阿拉伯日光時間」。也許這些差異是我看到「您當前的時區...」消息的原因之一。我讀過其他地方,重新啓動有幫助,並且此消息消失 - 不幸的是重新啓動後沒有任何變化。

+0

你是如何從'+4:00:00:00'到'-4:00:00:00'(美國東部夏令時間)? – Gabe

+0

我注意到了,當然。它可能是創建基於TimeZoneInfo的TimeZoneInformation的方法中的一個錯誤。但是,當涉及到問題時,它不會改變任何事情。爲什麼?因爲我使用了一次GetTimeZoneInformation方法 - 我寫下了結構中的所有值,並且下次我傳遞了完全相同的值。我仍然有「你目前的時區...」的消息。 – user3046525

回答

1

好吧。我發現我的錯誤。問題是,在Windows 7我試圖更改時區以:

[DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
private static extern bool SetTimeZoneInformation([In] ref TimeZoneInformation lpTimeZoneInformation); 

,而我應該使用:

[DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
private static extern bool SetDynamicTimeZoneInformation([In] ref DynamicTimeZoneInformation lpTimeZoneInformation); 

使用DYNAMIC_TIME_ZONE_INFORMATION解決大部分的問題就我目前的任務。

相關問題