Localization 找不到EWS时区错误-本地化问题?

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条目,以确定时区的

将Exchange日历与EWS同步时,客户端出现以下情况:

在Win 10客户端计算机上,调用GetTimeZoneInformation返回
时区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
    由操作系统语言本地化,不是标识符。它们仅用于人类展示。例如,
    DisplayName
    通常与下拉列表中的ID配对以选择时区。显示名称将显示给用户,相应的ID将保存在应用程序中。
    StandardName
    DaylightName
    与特定日期和时间一起用于人工显示,具体取决于生效日期和时间

GetTimeZoneInformation
返回的
TIME\u ZONE\u ID\u DAYLIGHT
与此无关。您不应该使用它来改变ID的名称(即,不要将“标准”替换为“日光”)

最终,听起来你只需要用户的时区id。有很多方法可以做到这一点。以下任何一项都可以:

  • 使用Win32 API,您可以调用,它返回一个结构。
    TimeZoneKeyName
    是您应该使用的ID

  • 您可以直接从注册表
    HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
    中的
    TimeZoneKeyName
    值中获取此信息

  • 如果您正在编写.NET代码,可以从
    TimeZoneInfo.Local.Id

  • 从命令行,您可以调用
    tzutil/g


    • 您将两个不同的概念混合在一起

      • 时区的
        ID
        “西欧标准时间”
        。它不适用于其他语言,也不适用于夏令时。同一个字符串用于涵盖标准时间和夏令时,尽管其中包含单词standard。(这是一个常见的混淆来源,本节也对其进行了介绍。)

      • StandardName
        DaylightName
        DisplayName
        由操作系统语言本地化,不是标识符。它们仅用于人类展示。例如,
        DisplayName
        通常与下拉列表中的ID配对以选择时区。显示名称将显示给用户,相应的ID将保存在应用程序中。
        StandardName
        DaylightName
        与特定日期和时间一起用于人工显示,具体取决于生效日期和时间

      GetTimeZoneInformation
      返回的
      TIME\u ZONE\u ID\u DAYLIGHT
      与此无关。您不应该使用它来改变ID的名称(即,不要将“标准”替换为“日光”)

      最终,听起来你只需要用户的时区id。有很多方法可以做到这一点。以下任何一项都可以:

      • 使用Win32 API,您可以调用,它返回一个结构。
        TimeZoneKeyName
        是您应该使用的ID

      • 您可以直接从注册表
        HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
        中的
        TimeZoneKeyName
        值中获取此信息

      • 如果您正在编写.NET代码,可以从
        TimeZoneInfo.Local.Id

      • 从命令行,您可以调用
        tzutil/g


      GetDynamicTimeZoneInformation成功了。使代码更容易;-)GetDynamicTimeZoneInformation成功了。使代码更容易;-)
      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