C# 使用TimeZoneInfo.ConvertTime()的时间不正确

C# 使用TimeZoneInfo.ConvertTime()的时间不正确,c#,datetime,timezone,C#,Datetime,Timezone,从转换时,我收到一个意外的日期时间: (UTC)都柏林、爱丁堡、里斯本、伦敦至(UTC-08:00)下加利福尼亚 下面是我一直在使用的代码。我希望serverDateTime是29/03/2016 00:00:01(-8小时),但我得到的是28/03/2016 23:00:01——相差9小时 private static void Main(string[] args) { ReadOnlyCollection<TimeZoneInfo> timeZo

从转换时,我收到一个意外的日期时间:

(UTC)都柏林、爱丁堡、里斯本、伦敦
(UTC-08:00)下加利福尼亚

下面是我一直在使用的代码。我希望
serverDateTime
29/03/2016 00:00:01
(-8小时),但我得到的是
28/03/2016 23:00:01
——相差9小时

    private static void Main(string[] args)
    {
        ReadOnlyCollection<TimeZoneInfo> timeZones = TimeZoneInfo.GetSystemTimeZones();
        TimeZoneInfo localTimeZone = timeZones.FirstOrDefault(tz => tz.DisplayName.Contains("London"));
        TimeZoneInfo serverTimeZone = timeZones.FirstOrDefault(tz => tz.DisplayName.Contains("California"));
        DateTime clientDateTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 29, 8, 0, 1);
        DateTime serverDateTime = TimeZoneInfo.ConvertTime(clientDateTime, localTimeZone, serverTimeZone);
    }
private static void Main(字符串[]args)
{
ReadOnlyCollection timeZones=TimeZoneInfo.GetSystemTimeZones();
TimeZoneInfo localTimeZone=timeZones.FirstOrDefault(tz=>tz.DisplayName.Contains(“伦敦”);
TimeZoneInfo服务器TimeZone=timeZones.FirstOrDefault(tz=>tz.DisplayName.Contains(“加利福尼亚”);
DateTime clientDateTime=新的日期时间(DateTime.Now.Year,DateTime.Now.Month,29,8,0,1);
DateTime serverDateTime=TimeZoneInfo.ConvertTime(clientDateTime、localTimeZone、serverTimeZone);
}
我的本地机器在英国,目前是UTC+1,下加利福尼亚州目前是UTC-7,所以我预计会有8小时的时差,而不是9小时。我做错了什么

提前感谢。

有几件事:

  • “(UTC-08:00)下加利福尼亚州”
    指的是-而不是美国加利福尼亚州
  • 此区域条目遵循墨西哥DST规则,即。因此,此条目仍在UTC-8上,解释您观察到的时差
  • 在Windows中,这个特定的条目实际上是错误的,因为事实证明,整个下加利福尼亚州都遵循美国的夏时制规则,而不是墨西哥的规则

    • 2015年10月和11月对此进行了广泛的多线程讨论。这导致了相应的IANA区域
      America/Santa_Isabel
      。它现在改为链接到
      America/Tijuana
      ,后者已经遵循美国DST规则
    • 微软尚未对其数据进行类似的更改,但很可能在未来更新Windows时区数据。(我已经向相关人员传达了这一点。)同时,使用
      (UTC-08:00)太平洋时间(美国和加拿大)
      ——即使您正在谈论墨西哥的下加利福尼亚州
  • 不要试图通过时区的
    DisplayName
    查找时区。这些值将因操作系统语言而异。相反,使用。
    Id
    属性未本地化。此外,Microsoft认为
    Id
    值是稳定的标识符,因此它们不会随着将来的更新而更改。
    DisplayName
    值在过去已经修改过,将来可能会发生变化

    • 对于
      (UTC)都柏林、爱丁堡、里斯本、伦敦“
    • 对于
      (UTC-08:00)太平洋时间(美国和加拿大)”
    • ID
      “太平洋标准时间(墨西哥)”
      用于
      “(UTC-08:00)下加利福尼亚州”
      ——但出于我所述的原因,请勿使用此条目
  • 实际上,您根本不应该关心服务器上的时区。服务器应仅与UTC有关。(请注意,伦敦不是UTC,因为它在夏季转换为英国夏令时)

  • 我不确定你的意图是什么:

    DateTime clientDateTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 29, 8, 0, 1);
    
    日期时间中提取月份和年份。现在
    将使用服务器的时区。然后,您可以结合固定的
    29
    日期和固定的
    8:00:01
    。这将在非闰年的2月份失败(当月只有28天),并且当服务器的日期与客户端的日期不在同一个月份和年份时(例如,接近从一个月过渡到另一个月时),也可能给出错误的日期

    • 有几件事:

      • “(UTC-08:00)下加利福尼亚州”
        指的是-而不是美国加利福尼亚州
      • 此区域条目遵循墨西哥DST规则,即。因此,此条目仍在UTC-8上,解释您观察到的时差
      • 在Windows中,这个特定的条目实际上是错误的,因为事实证明,整个下加利福尼亚州都遵循美国的夏时制规则,而不是墨西哥的规则

        • 2015年10月和11月对此进行了广泛的多线程讨论。这导致了相应的IANA区域
          America/Santa_Isabel
          。它现在改为链接到
          America/Tijuana
          ,后者已经遵循美国DST规则
        • 微软尚未对其数据进行类似的更改,但很可能在未来更新Windows时区数据。(我已经向相关人员传达了这一点。)同时,使用
          (UTC-08:00)太平洋时间(美国和加拿大)
          ——即使您正在谈论墨西哥的下加利福尼亚州
      • 不要试图通过时区的
        DisplayName
        查找时区。这些值将因操作系统语言而异。相反,使用。
        Id
        属性未本地化。此外,Microsoft认为
        Id
        值是稳定的标识符,因此它们不会随着将来的更新而更改。
        DisplayName
        值在过去已经修改过,将来可能会发生变化

        • 对于
          (UTC)都柏林、爱丁堡、里斯本、伦敦“
        • 对于
          (UTC-08:00)太平洋时间(美国和加拿大)”
        • ID
          “太平洋标准时间(墨西哥)”
          用于
          “(UTC-08:00)下加利福尼亚州”
          ——但出于我所述的原因,请勿使用此条目
      • 实际上,您根本不应该关心服务器上的时区。服务器应仅与UTC有关。(请注意,伦敦不是UTC,因为