下面是一個例子。我寫這篇文章時的電腦被設置爲美國太平洋時區,現在是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
類,這是其他方法進行:
重要
儘可能使用,而不是TimeZone
類TimeZoneInfo
類。
此外,TimeZone
類已經從新.Net CoreCLR項目中刪除。
關於「調整規則」 - MSDN備註特指TimeZoneInfo.AdjustmentRule
類,該類用於跟蹤時區內定期或不定期發生的時區偏移更改。夏令時是可能發生的一種類型的變化,但也有其他變化。
您可能希望閱讀關於daylight saving time和time zones的StackOverflow維基,以瞭解這些更改背後的機制。
你也可以試試我的Pluralsight課程,Date and Time Fundamentals,它更詳細地解釋了這些概念。
參見:What is the difference between DateTime.ToUniversalTime
and TimeZoneInfo.ConvertTimeToUtc
?
的調整規則的一個例子是英國夏令時間,因此在英國有在夏季一小時從GMT偏移 – paul 2015-03-02 11:10:18