在TimeZoneInfo.ConvertTimeToUtc()
的MSDN页面中,有以下信息框:
如果当前计算机的本地时区包含多个调整规则,则ConvertTimeToUtc方法的此重载可以返回与TimeZone.ToUniversalTime和DateTime.ToUniversalTime方法不同的结果。无论dateTime是否在其日期范围内,TimeZone.ToUniversalTime始终将当前调整规则应用于时区转换。在.NET Framework 3.5上执行时,DateTime.ToUniversalTime也会将当前调整规则应用于时区转换,无论dateTime是否位于其日期范围内。
我不确定我明白这意味着什么。这些调整规则是什么?ConvertTimeToUtc()
和TimeZone.ToUniversalTime()
之间的结果有何不同?
答案 0 :(得分:6)
这是一个例子。我写这篇文章时的电脑设置为美国太平洋时区,今天是2015年3月2日。它目前是太平洋标准时间(或PST),比UTC晚8小时。
DateTime dt = new DateTime(2006, 4, 1, 0, 0, 0);
TimeZoneInfo tzi = TimeZoneInfo.Local;
DateTime utc = TimeZoneInfo.ConvertTimeToUtc(dt, tzi);
在上面的代码中,我将2006年4月1日午夜的另一个值从我的时区转换为UTC。在该特定时间点,太平洋标准时间(或太平洋标准时间)生效。上面的代码使用TimeZoneInfo
,这是正确的方法。输出日期为2006年4月1日上午8:00 UTC。
现在看看这段代码:
DateTime dt = new DateTime(2006, 4, 1, 0, 0, 0);
TimeZone tz = TimeZone.CurrentTimeZone;
DateTime utc = tz.ToUniversalTime(dt);
它似乎做了几乎相同的事情。但它返回的值不正确,为UTC时间上午7:00。
这是因为美国changed it's daylight saving time规则生效2007年。在示例中的日期,DST当时没有实施规则生效,但如果<当时当前的规则已经到位。
很简单,TimeZoneInfo
对象知道此更改,但TimeZone
对象不是。它错误地认为现行规则始终有效。
TimeZone
类上的其他方法也会出现同样的情况,这就是the MSDN reference所说的原因:
重要强>
只要有可能,请使用TimeZoneInfo
类而不是TimeZone
类。
此外,TimeZone
类已从新.Net CoreCLR项目中删除。
关于&#34;调整规则&#34; - MSDN备注专门指TimeZoneInfo.AdjustmentRule
类,用于跟踪时区内定期或不定期发生的时区偏移的变化。夏令时是可以发生的一种类型的变化,但也有其他变化。
您可能希望阅读有关daylight saving time和time zones的StackOverflow wiki,以了解这些更改背后的机制。
您也可以尝试我的Pluralsight课程Date and Time Fundamentals,它会更详细地解释这些概念。
另请参阅:What is the difference between DateTime.ToUniversalTime
and TimeZoneInfo.ConvertTimeToUtc
?