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

时间:2015-10-06 07:00:07

标签: windows winapi timezone

答案似乎是否定,但我看到一个客户跟踪显示西班牙语的本地时区名称。信息来源来自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是否会非英语?

1 个答案:

答案 0 :(得分:3)

我不确定你在哪里读到他们只是英文。来自MSDN Documentation

  

StandardNameDaylightName都根据当前用户默认的UI语言进行了本地化。

此外,在现代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控制面板中)或{{1在命令行上,或在.NET中使用tzutil.exe。它不是Win32结构的一部分。

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

在这里,您可以看到Windows控制面板中的显示名称在英文和中文中的显示方式。使用标准和日光名称进行类似的本地化:

Windows Time Zone Control Panels

最后 - 恕我直言,这些名字在很多情况下都非常垃圾。例如,没有“GMT Daylight Time”这样的东西 - 它实际上被称为“英国夏令时”。唯一的本地化时区名称的最佳来源是CLDR,您可以直接使用它,也可以通过C和Java中的ICU或我的TimeZoneNames库中的库来使用。 NET。