TIME_ZONE_INFORMATION 结构中的 Microsoft 时区名称是否已翻译?

Are Microsoft time zone names in TIME_ZONE_INFORMATION structure ever translated?

答案似乎是否定的,但我看到一个客户跟踪显示西班牙语的本地时区名称。信息来源来自 GetTimeZoneInformation。该文件说,结构中的这些名称将始终是英文,用户可见的名称来自资源文件。无论哪种方式都能得到确认会很棒。说清楚,就是这个结构:

typedef struct _TIME_ZONE_INFORMATION {
  LONG       Bias;
  WCHAR      StandardName[32];
  SYSTEMTIME StandardDate;
  LONG       StandardBias;
  WCHAR      DaylightName[32];
  SYSTEMTIME DaylightDate;
  LONG       DaylightBias;
} TIME_ZONE_INFORMATION, *PTIME_ZONE_INFORMATION;

StandardName 和 DaylightName 会是非英语的吗?

我不确定你在哪里读到的只有英文。来自 MSDN Documentation:

Both StandardName and DaylightName are localized according to the current user default UI language.

此外,在现代 Windows 上,您应该主要使用 DYNAMIC_TIME_ZONE_INFORMATION 结构和 GetDynamicTimeZoneInformation 等 API,而不是经典的 GetTimeZoneInformation 函数。此结构包含相同的标准名称和日光名称,并且也进行了本地化。

按预期使用时,这些结构会填充 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones 下 Windows 注册表中的信息。每个条目都有四个相关的字符串:

  • Std 值是标准时间生效时要使用的本地化名称。这将映射到结构中的 StandardName 字段。

  • Dlt 值是夏令时生效时要使用的本地化名称。这被映射到结构中的 DaylightName 字段。

  • Display 值是用于一般表示时区条目的本地化名称,在显示时区列表时使用 - 例如在 Windows控制面板,或在命令行上使用 tzutil.exe,或在 .NET 中使用 TimeZoneInfo.DisplayName。它不是任何 Win32 结构的一部分。

  • 注册表项的 从未本地化。它始终为英文,并且是时区的唯一标识符。在DYNAMIC_TIME_ZONE_INFORMATION 结构中,它对应于TimeZoneKeyName 字段。在 .NET 中,它对应于 TimeZoneInfo.Id。还要记住,虽然键 通常 与标准名称的英文形式相匹配,但也有一些不匹配的例外情况。此外,特定键的名称保证永远不会更改,而理论上它下的本地化值可以。

在这里,您可以看到显示名称在 Windows 控制面板中的英文和中文显示方式。标准名称和夏令时名称也有类似的本地化:

最后 - 恕我直言,这些名称在很多情况下都非常垃圾。例如,没有 "GMT Daylight Time" 这样的东西——它实际上叫做 "British Summer Time"。本地化时区名称的唯一好来源是 .NET 的 CLDR, which you can either consume directly, or through libraries such as ICU in C and Java, or my TimeZoneNames 库。