如何在C#中显示国家的正确时区名称?

我正在尝试使用Timezone类获取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)中将时区更改为“阿姆斯特丹,柏林,伯尔尼,罗马,斯德哥尔摩,维也纳”时区时,标准时区名称should返回“中欧标准时间” ”(或简称为 CET )。返回的时区为“西欧标准时间”(或简称为 WET )。

我做错什么了吗?还是这种错误?

我有read的一些有关必须使用“ Unicode Common Locale Data Repository”或“ CLDR”的信息。这些天我是否想随时使用install a package

guozili1983 回答:如何在C#中显示国家的正确时区名称?

您的缓存没有问题。这只是数据的本质。

对于您所描述的时区,Windows(英语)中的数据为:

Id           = "W. Europe Standard Time"
DisplayName  = "Amsterdam,Berlin,Bern,Rome,Stockholm,Vienna"
StandardName = "W. Europe Standard Time"
DaylightName = "W. Europe Daylight Time"

您可以使用IsDaylightSavingTime实例的TimeZoneInfo方法来决定选择哪一个。

您不应再使用TimeZone类-已弃用。使用TimeZoneInfo.Local代替TimeZone.CurrentTimeZone

实际上,Windows在StandardNameDisplayName字段中给出的名称并不理想。他们常常不符合期望。这就是为什么我写了TimeZoneNames包的原因。 I also blogged in detail about this problem

使用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

本文链接:https://www.f2er.com/3167961.html

大家都在问