簡體   English   中英

如何在 C# 中顯示國家/地區的正確時區名稱?

[英]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 在StandardNameDisplayName字段中給出的名稱並不理想。 它們通常與預期不一致。 這就是我編寫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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM