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
,后者已经遵循美国DST规则America/Tijuana
- 微软尚未对其数据进行类似的更改,但很可能在未来更新Windows时区数据。(我已经向相关人员传达了这一点。)同时,使用
——即使您正在谈论墨西哥的下加利福尼亚州(UTC-08:00)太平洋时间(美国和加拿大)
- 2015年10月和11月对此进行了广泛的多线程讨论。这导致了相应的IANA区域
- 不要试图通过时区的
查找时区。这些值将因操作系统语言而异。相反,使用。DisplayName
属性未本地化。此外,Microsoft认为Id
值是稳定的标识符,因此它们不会随着将来的更新而更改。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
。这将在非闰年的2月份失败(当月只有28天),并且当服务器的日期与客户端的日期不在同一个月份和年份时(例如,接近从一个月过渡到另一个月时),也可能给出错误的日期8:00:01
指的是-而不是美国加利福尼亚州“(UTC-08:00)下加利福尼亚州”
- 此区域条目遵循墨西哥DST规则,即。因此,此条目仍在UTC-8上,解释您观察到的时差
- 在Windows中,这个特定的条目实际上是错误的,因为事实证明,整个下加利福尼亚州都遵循美国的夏时制规则,而不是墨西哥的规则
- 2015年10月和11月对此进行了广泛的多线程讨论。这导致了相应的IANA区域
。它现在改为链接到America/Santa_Isabel
,后者已经遵循美国DST规则America/Tijuana
- 微软尚未对其数据进行类似的更改,但很可能在未来更新Windows时区数据。(我已经向相关人员传达了这一点。)同时,使用
——即使您正在谈论墨西哥的下加利福尼亚州(UTC-08:00)太平洋时间(美国和加拿大)
- 2015年10月和11月对此进行了广泛的多线程讨论。这导致了相应的IANA区域
- 不要试图通过时区的
查找时区。这些值将因操作系统语言而异。相反,使用。DisplayName
属性未本地化。此外,Microsoft认为Id
值是稳定的标识符,因此它们不会随着将来的更新而更改。Id
值在过去已经修改过,将来可能会发生变化DisplayName
- 对于
(UTC)都柏林、爱丁堡、里斯本、伦敦“
- 对于
(UTC-08:00)太平洋时间(美国和加拿大)”
- ID
用于“太平洋标准时间(墨西哥)”
——但出于我所述的原因,请勿使用此条目“(UTC-08:00)下加利福尼亚州”
- 对于
- 实际上,您根本不应该关心服务器上的时区。服务器应仅与UTC有关。(请注意,伦敦不是UTC,因为
- 有几件事: