2015-03-02 38 views
4

在为TimeZoneInfo.ConvertTimeToUtc()的MSDN页,有这样的信息框:将DateTime转换为UTC时的调整规则是什么?

如果当前计算机的本地时区包含多个调整规则,这种超载ConvertTimeToUtc方法可以返回从TimeZone.ToUniversalTime不同结果DateTime.ToUniversalTime方法。 TimeZone.ToUniversalTime始终将当前调整规则应用于时区转换,无论dateTime是否在日期范围内。在.NET Framework 3.5上执行时,DateTime.ToUniversalTime还会将当前调整规则应用于时区转换,而不管dateTime是否在日期范围内。

我不确定我明白这是什么意思。这些调整规则是什么,以及ConvertTimeToUtc()TimeZone.ToUniversalTime()之间的结果有何不同?

+2

的调整规则的一个例子是英国夏令时间,因此在英国有在夏季一小时从GMT偏移 – paul 2015-03-02 11:10:18

回答

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。在那个特定时间点,太平洋标准时间(或PST)已生效。上面的代码使用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对象不是。它错误地认为现行规则始终有效。为什么the MSDN reference

同样的事情将在TimeZone类,这是其他方法进行:

重要
尽可能使用,而不是TimeZoneTimeZoneInfo类。

此外,TimeZone类已经从新.Net CoreCLR项目中删除

关于“调整规则” - MSDN备注特指TimeZoneInfo.AdjustmentRule类,该类用于跟踪时区内定期或不定期发生的时区偏移更改。夏令时是可能发生的一种类型的变化,但也有其他变化。

您可能希望阅读关于daylight saving timetime zones的StackOverflow维基,以了解这些更改背后的机制。

你也可以试试我的Pluralsight课程,Date and Time Fundamentals,它更详细地解释了这些概念。

参见:What is the difference between DateTime.ToUniversalTime and TimeZoneInfo.ConvertTimeToUtc?

相关问题