2

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

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

读过一些关于必须使用称为“ Unicode Common Locale Data Repository ”或简称为“CLDR”的东西的内容。这些天我想使用时区相关代码时是否需要安装软件包?

4

1 回答 1

2

你的缓存没有问题。这只是数据的性质。

对于您描述的时区,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包的原因。 我也在博客中详细介绍了这个问题

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

于 2019-11-04T16:00:59.793 回答