2016-11-17 7 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 и Pacific заключается в том, что 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, но вместо этого я получаю дополнительный час, добавленный к моему результату.

В качестве теста, когда я конвертирую в PST или GMT или EST со времени UTC, они, похоже, обращаются обратно правильно.

Я чувствую, что мне не хватает чего-то очевидного или чего-то простенького?

+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".

Как запутанный характер этих идентификаторов, смотрите раздел о часовых поясах для Windows в the timezone tag wiki.

Если вы хотите использовать стандартные идентификаторы IANA, используйте Noda Time.