2015-03-02 48 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?