3

在我的本地计算机中,我尝试使用以下方法访问 IANA 时区的偏移值converter

foreach (var timeZone in TZConvert.KnownIanaTimeZoneNames)
{
  var tzi = TZConvert.GetTimeZoneInfo(timeZone.ToString());
  TimeSpan offset = tzi.GetUtcOffset(DateTime.Now);
  .......
}

该行TZConvert.GetTimeZoneInfo(timeZone.ToString())有时会抛出一个错误说

System.TimeZoneNotFoundException: 'The time zone ID 'Sudan Standard Time' was not found on the local computer.'

当我使用相同的命令在 power shell 上尝试相同的操作时,

PS C:\Users\SajeetharanS> [System.TimeZoneInfo]::FindSystemTimeZoneById("Aleutian Standard Time") 使用“1”参数调用“FindSystemTimeZoneById”的异常:“找不到时区 ID 'Aleutian Standard Time'在本地计算机上。” 在 line:1 char:1 + [System.TimeZoneInfo]::FindSystemTimeZoneById("Aleutian Standard Time ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: ( :) [],MethodInvocationException + FullyQualifiedErrorId:TimeZoneNotFoundException

为什么缺少一些时区信息?我该如何解决?

4

1 回答 1

2

特定时区,微软刚刚"Sudan Standard Time"2017 年 12 月 12 日发布。运行代码的计算机很可能还没有此更新。请参阅支持文档的“如何获取此更新”部分。(基本上,运行 Windows 更新)。

至于"Aleutian Standard Time",那是在 2016 年 6 月发布的。因此,如果计算机没有此功能,那么它的更新就很落后了。

一般来说,时区是一个移动的目标,因为世界各国政府都会更改其标准偏移和 DST 政策。为了获得准确的当地时间,保持最新状态是必不可少的。

您正在使用的我的 TimeZoneConverter 库假设计算机是最新的。当 Microsoft 和 IANA 发布时区更改时,我会推送更新,但我不会尝试协调特定计算机是否安装了时区。

如果您尝试列出计算机上的所有时区,最好使用内置TimeZoneInfo.GetSystemTimeZones()方法,然后使用.Id每个时区的属性。

此外,在大多数情况下,您不想使用.StandardName,因为.StandardName.DaylightName.DisplayName属性已针对操作系统上安装的语言进行了本地化。有时.Id匹配.StandardName,但不能保证 - 即使是英语。

于 2017-12-15T18:09:09.233 回答