Localization 找不到EWS时区错误-本地化问题?
将Exchange日历与EWS同步时,客户端出现以下情况: 在Win 10客户端计算机上,调用GetTimeZoneInformation返回Localization 找不到EWS时区错误-本地化问题?,localization,timezone,exchangewebservices,Localization,Timezone,Exchangewebservices,将Exchange日历与EWS同步时,客户端出现以下情况: 在Win 10客户端计算机上,调用GetTimeZoneInformation返回时区ID\u DAYLIGHT,即“系统在时区信息结构的DaylightDate成员覆盖的范围内运行。” 标准名称为:W.欧洲标准时间 DaylightName是:W.Europe夏令时 正确地说,我现在需要搜索HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\TimeZones\的Dlt条目,以确定时区的
时区ID\u DAYLIGHT
,即“系统在时区信息结构的DaylightDate成员覆盖的范围内运行。”标准名称为:W.欧洲标准时间
DaylightName是:W.Europe夏令时 正确地说,我现在需要搜索
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\TimeZones\
的Dlt
条目,以确定时区的根密钥名称。但“W.Europe夏令时”不存在:有139个条目,但没有一个条目名为“W.Europe夏令时” 因此,我的代码无法转换为正确的根密钥名称,并在EWS SOAP调用中放入“W.Europe夏令时”,如下所示:
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:typ="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:mes="http://schemas.microsoft.com/exchange/services/2006/messages">
<soapenv:Header>
<typ:RequestServerVersion Version="Exchange2013"/>
<typ:MailboxCulture>en-US</typ:MailboxCulture>
<typ:TimeZoneContext>
<typ:TimeZoneDefinition Id="W. Europe Daylight Time"/>
</typ:TimeZoneContext>
</soapenv:Header>
<soapenv:Body>
<mes:ResolveNames ReturnFullContactData="1" SearchScope="ActiveDirectory">
<mes:UnresolvedEntry>someone@somewhere.com</mes:UnresolvedEntry>
</mes:ResolveNames>
</soapenv:Body>
</soapenv:Envelope>
在客户端计算机上,在注册表中搜索“W.Europe”,我发现一个条目显示:
RootKeyName: W. Europe Standard Time
DisplayName: (UTC+01:00) Amsterdam, Berlijn, Bern, Rome, Stockholm, Wenen
StandardName: West-Europa (standaardtijd)
DaylightName: West-Europa (zomertijd)
此计算机具有以下语言设置:
Default system UI language : en-US
System locale : nl-NL
Default time zone : W. Europe Standard Time
Installed language(s): en-US
Type : Fully localized language.
Installed language(s): nl-NL
Type : Partially localized language, MUI type.
Fallback Languages en-US
我怀疑这些“本地化的”(?)StandardName/DaylightName注册表值阻止我正确查找“西欧标准时间”时区ID
FWIW,Exchange服务器具有:
TIME_ZONE_ID_DAYLIGHT
StandardName: W. Europe Standard Time
DaylightName: W. Europe Daylight Time
并且有一个注册表项
RootKeyName: W. Europe Standard Time
DisplayName: (UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna
StandardName: W. Europe Standard Time
DaylightName: W. Europe Daylight Time
如何解决这个问题?您将两个不同的概念混合在一起
- 时区的
是ID
。它不适用于其他语言,也不适用于夏令时。同一个字符串用于涵盖标准时间和夏令时,尽管其中包含单词standard。(这是一个常见的混淆来源,本节也对其进行了介绍。)“西欧标准时间”
、StandardName
和DaylightName
由操作系统语言本地化,不是标识符。它们仅用于人类展示。例如,DisplayName
通常与下拉列表中的ID配对以选择时区。显示名称将显示给用户,相应的ID将保存在应用程序中。DisplayName
和StandardName
与特定日期和时间一起用于人工显示,具体取决于生效日期和时间DaylightName
GetTimeZoneInformation
返回的TIME\u ZONE\u ID\u DAYLIGHT
与此无关。您不应该使用它来改变ID的名称(即,不要将“标准”替换为“日光”)
最终,听起来你只需要用户的时区id。有很多方法可以做到这一点。以下任何一项都可以:
- 使用Win32 API,您可以调用,它返回一个结构。
是您应该使用的IDTimeZoneKeyName
- 您可以直接从注册表
中的HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
值中获取此信息TimeZoneKeyName
- 如果您正在编写.NET代码,可以从
TimeZoneInfo.Local.Id
- 从命令行,您可以调用
tzutil/g
- 时区的
是ID
。它不适用于其他语言,也不适用于夏令时。同一个字符串用于涵盖标准时间和夏令时,尽管其中包含单词standard。(这是一个常见的混淆来源,本节也对其进行了介绍。)“西欧标准时间”
、StandardName
和DaylightName
由操作系统语言本地化,不是标识符。它们仅用于人类展示。例如,DisplayName
通常与下拉列表中的ID配对以选择时区。显示名称将显示给用户,相应的ID将保存在应用程序中。DisplayName
和StandardName
与特定日期和时间一起用于人工显示,具体取决于生效日期和时间DaylightName
- 您将两个不同的概念混合在一起
GetTimeZoneInformation
返回的TIME\u ZONE\u ID\u DAYLIGHT
与此无关。您不应该使用它来改变ID的名称(即,不要将“标准”替换为“日光”)
最终,听起来你只需要用户的时区id。有很多方法可以做到这一点。以下任何一项都可以:
- 使用Win32 API,您可以调用,它返回一个结构。
是您应该使用的IDTimeZoneKeyName
- 您可以直接从注册表
中的HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
值中获取此信息TimeZoneKeyName
- 如果您正在编写.NET代码,可以从
TimeZoneInfo.Local.Id
- 从命令行,您可以调用
tzutil/g
RootKeyName: W. Europe Standard Time
DisplayName: (UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna
StandardName: W. Europe Standard Time
DaylightName: W. Europe Daylight Time