2015-04-17 2 views
5

Итак, у меня есть веб-сервер, размещенный в центральном стандартном часовом поясе. Сервер IIS настроен на это как Часовой пояс, поэтому всякий раз, когда вы используете DateTime.Now на сервере или создаете новую DateTime, где тип Local, он находится в центральном времени.Конвертировать DateTime с определенного часового пояса в UTC с помощью Nodatime?

Проблема в том, что сайт является (меж) национальной заявкой, и я мог бы иметь клиентов в любой точке США или Канады. Одна из вещей, которые имеет сайт, - это «Планировщик» для планирования назначений. Мы решили упростить разработку для хранения всех значений DateTime в базе данных в формате UTC и что весь трафик в API и из него также находится в UTC. Проблема в том, что я часто сталкиваюсь с проблемами при создании значений даты/времени на стороне сервера.

Скажем, например, мне нужно программно создать встречу для клиента в Тихом океане Стандартного часового пояса на сервере в течение 8 часов. В прошлом, я сделал что-то вроде этого:

var appointment = new new DateTime(2015, 04, 17, 08, 00, 00, DateTimeKind.Unspecified) 
var utcAppointment = TimeZoneInfo.ConvertTimeToUtc(appointment, 
         TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time")) 

Я много других манипуляций даты/времени, а также в рамках моей программы и имею в виду только собирается Nodatime вместо этого. Я знаю, что довольно легко получить UTC DateTime из переменной Nodatime. Я смущен, как создать переменную Nodatime для определенного часового пояса в определенную дату/время? Все примеры, которые я вижу, связаны с шаблонами и чтением строк или созданием Мгновенного момента, который по существу «сейчас». Я хочу сделать что-то вроде существующего объекта BCL DateTime, независимо от «Kind», и преобразовать его в объект Nodatime с определенным часовым поясом, который я установил.

Я думаю, что Nodatime - отличная библиотека, но чтение userguide просто заставило меня почесывать голову о преобразовании в BCL и из него.

+0

Я спросил что-то подобное [здесь] (http://stackoverflow.com/q/7553997/397817), но это не был изначально вопрос NodaTime. Дискуссия может быть полезной для будущих читателей этого вопроса. Кроме того, я могу предложить второе предложение Джона Скита использовать типы NodaTime в веб-API, если это необходимо, например. LocalTime для временной части вашего расписания - есть даже вспомогательная библиотека для сериализации, NodaTime.Serialization.JsonNet. –

ответ

9

С чем я смущен - как создать переменную Nodatime для определенного часового пояса в определенную дату/время?

Это относительно легко:

LocalDateTime local = new LocalDateTime(2015, 4, 17, 8, 0, 0); 
DateTimeZone zone = DateTimeZoneProviders.Tzdb["America/Los_Angeles"]; 
ZonedDateTime zonedTime = local.InZoneLeniently(zone); 

«снисходительно» часть действительно зависит от того, что вы хотите, чтобы произошло, если 8 утра оказывается пропускаться или неоднозначным - что не будет в этом случае, но это то, что нужно помнить. Noda Time позволяет вам разобраться с этим по-разному - user guide более подробно.

Обратите внимание, что если вы предпочитаете думать в терминах зоны, выполняющей преобразование, вместо этого вы можете использовать zone.AtLeniently(local) - они абсолютно эквивалентны.

+0

Если бы у меня был существующий объект BCL DateTime, я бы взял его, я тоже мог бы использовать LocalDateTime.FromDateTime (objectName)? – SpaceCowboy74

+0

@ SpaceCowboy74: Да, хотя я бы рекомендовал использовать типы Noda Time как можно шире. –

+0

Понял. Проблема в том, что внешние силы и сам WebApi иногда передают мне объекты DateTime. Мне нужно потреблять тех, кто хочет конвертировать в UTC. Я выделил некоторые из них и смог сделать это с вашим кодом выше, а затем передал zonedTime в EntityFramwork с помощью вызова ToDateTimeUtc. – SpaceCowboy74