2014-10-23 2 views
2

Мой вызов веб-службы сторонним приложениям возвращает значения даты, часового пояса и timezone_offset. Мне нужно добавить это в календарь в приложении Asp.net. Каков наилучший способ объединить это вместе, чтобы мой объект даты понял, что его из восточного часового пояса?Как совместить дату и смещение временной зоны в приложении ASP.net?

<start_date>2014-11-17 19:00:00</start_date> 
<timezone>America/New_York</timezone> 
<timezone_offset>GMT-0500</timezone_offset> 
+1

Попробуйте NodaTime для этого - http://nodatime.org/ – govin

ответ

0

Поскольку вы смещения тоже можно использовать DateTimeOffset.Parse(), чтобы получить DateTimeOffset. Оттуда вы можете прочитать свойство DateTime. Выходная переменная дт будет иметь 2014-11-17 7:00:00 PM с DateTimeKind собственности установлен в положение «Не выбрано»

var dtOffset = DateTimeOffset.Parse("2014-11-17 19:00:00-0500", CultureInfo.InvariantCulture); 
var dt = dtOffset.DateTime; 

DateTimeOffset представляет собой точку во времени. Обычно это относится к UTC. Таким образом, это естественная структура для первоначального анализа полей, которые у вас есть.

Если вы хотите получить ссылку на одно и то же время в UTC, вы можете использовать это. Здесь выходная переменная дт будет 2014-11-18 12:00:00 AM с DateTimeKind собственности установлен в «Utc»

var dt = DateTime.Parse("2014-11-17 19:00:00-0500", CultureInfo.InvariantCulture).ToUniversalTime(); 

Если у вас нет смещения, но только имеют timeZoneId, вы можете сделайте это, но для этого вам понадобится NodaTime.

0

я остановлюсь на этой части вопроса:

Что такое лучший способ совместить это вместе с тем, что мой объект дата понимает, что его из Восточной временной зоны?

В .NET нет такого типа данных, который может это сделать достаточно. Тип DateTimeOffset ассоциируется с определенным смещением, например -05:00 или -04:00, которые могут использоваться восточным часовым поясом (в зависимости от даты). Но те же самые смещения могут также поступать из какого-то другого часового пояса. Часовой пояс имеет один или несколько смещений, но смещение не является часовым поясом.

К счастью, есть решения. Есть два варианта, чтобы рассмотреть:

  1. Вы можете пару А DateTimeOffset с TimeZoneInfo объекта. При их хранении или передаче вы должны отправить только DateTimeOffset вместе с Id часового пояса.

  2. Библиотека Noda Time является гораздо более эффективным способом работы с датой и временем, особенно когда речь идет о проблемах с часовым поясом. Он содержит тип, называемый ZonedDateTime, который уже объединяет дату, время, смещение и часовой пояс. Его также можно использовать для работы с идентификаторами часовых поясов IANA, такими как часовой пояс "America/New_York", указанный вами в вопросе.

Смежные вопросы