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