[英]C# - How do I set my winform to my country's current timezone
[英]How do I display the correct timezone name for a country in C#?
我正在嘗試使用時區 class 來獲取 C# 中某個國家/地區的當前時區。 我使用了Timezone.CurrentTimeZone.StandardName
,但是,這會返回不正確的時區名稱。
這是我到目前為止所嘗試的:
TimeZoneInfo.ClearCachedData();
Console.WriteLine("Local machine's time zone is: " + TimeZone.CurrentTimeZone.StandardName + " " + TimeZoneInfo.Local.StandardName + Environment.NewLine);
當我將 Windows(目前我使用 Windows 10)中的設置更改為“阿姆斯特丹、柏林、伯爾尼、羅馬、斯德哥爾摩、維也納”時,時區標准名稱應返回“中歐標准時間”(或簡稱CET ) . 返回的時區是“西歐標准時間”(或簡稱WET )。
我做錯了什么還是這是某種錯誤?
我讀過一些關於必須使用名為“ Unicode Common Locale Data Repository ”或簡稱為“CLDR”的東西的內容。 這些天我想使用時區相關代碼的任何時候都需要安裝 package嗎?
你的緩存沒有問題。 這只是數據的性質。
對於您描述的時區,Windows(英文)中的數據為:
Id = "W. Europe Standard Time"
DisplayName = "Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna"
StandardName = "W. Europe Standard Time"
DaylightName = "W. Europe Daylight Time"
您可以使用TimeZoneInfo
實例的IsDaylightSavingTime
方法來決定選擇哪個。
您不應再使用TimeZone
class - 它已被棄用。 使用TimeZoneInfo.Local
而不是TimeZone.CurrentTimeZone
。
事實上,Windows 在StandardName
和DisplayName
字段中給出的名稱並不理想。 它們通常與預期不一致。 這就是我編寫TimeZoneNames package 的原因。 我也在博客中詳細介紹了這個問題。
使用 TimeZoneNames,您可以獲得更好的當前時區名稱,如下所示:
var names = TZNames.GetNamesForTimeZone(TimeZoneInfo.Local.Id, "en-US");
對於與以前相同的時區,您現在將獲得 CLDR 名稱:
names.Generic = "Central European Time"
names.Standard = "Central European Standard Time"
names.Daylight = "Central European Summer Time"
同樣,您可以使用TimeZoneInfo.Local.IsDaylightSavingTime
來決定是顯示標准名稱還是日光名稱。
如果您不想對語言進行硬編碼,請使用CultureInfo.CurrentCulture.IetfLanguageTag
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.