2016-11-17 27 views
1

我轉換,它表示在太平洋時區時間,我使用創建一個DateTime對象的字符串:TimeZoneInfo.ConvertTime從PST到UTC AEST - 關閉一小時

var pacificDateTime = new DateTime(2016, 11, 16, 15, 0, 0) // 11/16/2016 3:00:00 PM 

利用這一點,我創建一個DateTimeOffset,因爲最終它變得更容易處理。

var pacificTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 
var dateTimeNoKind = new DateTime(pacificDateTime.Ticks, DateTimeKind.Unspecified) 
var DateTimeOffsetValue = TimeZoneInfo.ConverTimeToUtc(dateTimeNoKind, pacificTimeZoneInfo) // 11/16/2016 11:00:00 PM 

到目前爲止這麼好。 UTC與太平洋的區別在於UTC提前8小時(給定時間在夏令時範圍內)。

然後我想轉換從UTC到AEST,但是這是問題出現的位置:

var australianEasternTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time"); 
TimeZoneInfo.ConvertTime(DateTimeOffsetValue, australianEasternTimeZoneInfo) // 11/17/2016 10:00:00 AM 

AEST領先UTC通過10小時。我曾預計價值爲11/17/2016 09:00:00 AM,但我得到了一個額外的小時增加了我的結果。

作爲一項測試,當我從UTC時間轉換爲PST或GMT或EST時,它們似乎會正確轉換回來。

我覺得我缺少明顯的東西或忽略了一些簡單的東西?

+0

AEST當前是UTC + 11,而不是UTC + 10。我們正在享受夏令時。 'TimeZoneInfo.FindSystemTimeZoneById(「AUS東部標準時間」)。IsDaylightSavingTime(DateTime.UtcNow)' – Rob

+1

@Rob實際上AEST總是UTC + 10,它只是澳大利亞目前並沒有觀察它而是AEDT。 – zerkms

+1

@zerkms你是對的 - 這是我忽視的一個區別。然而,''AUS東部標準時間''內部映射到同一個區域,'DaylightName'和'StandardName' – Rob

回答

4

維基百科的Time in Australia article

Australian Time Zones

澳大利亞有兩個東部時區。在東北部,UTC + 10全年適用。在東南方,UTC + 10在標準時間內適用,並且UTC + 11在白天時間(夏季時間)內適用。

東北地區(昆士蘭州)使用IANA時區標識"Australia/Brisbane",而東南地區(新南威爾士)使用"Australia/Sydney"。這些correspond到Windows時區標識符分別爲:"E. Australia Standard Time""AUS Eastern Standard Time"

  • 如果您要轉換爲昆士蘭州,請使用"E. Australia Standard Time"

  • 如果您要轉換新南威爾士州,請使用"AUS Eastern Standard Time"

至於這些標識符的混淆性質,請參閱the timezone tag wiki中有關Windows時區的部分。

如果您想要使用標準IANA標識符,請使用Noda Time