Я знаю, что DateTimeOffset хранит дату / время в формате UTC и смещение.Я также знаю из этой записи в блоге MSDN , что DateTimeOffset следует использовать для «работы с переходами на летнее время».
Я пытаюсь понять, как именно работает DateTimeOffset (и)с летним временем ».Насколько я понимаю, мало того, что переход на летнее время является политическим решением и не может быть выведен из чисто компромисса.Как может получиться, что эта структура дружественна к DST, если она хранит только смещение?
Я понимаю, что может быть способ использовать класс TimeZoneInfo в сочетании с DateTimeOffset.Как мне это сделать?
Наконец, есть ли какие-нибудь лучшие способы, которыми я мог бы достичь следующего?
(я видел несколько сообщений от Джона Скита о Noda-Time но я понимаю, что это еще не готово к производству, и я не знаю, будет ли оно хорошо интегрировано в наше существующее решение).
Вот наш сценарий.Сервер по неудачным старым причинам работает по британскому времени.У нас есть клиенты, которые начинают работать из Австралии, которая имеет несколько часовых поясов.Другие страны могут подключиться к сети в любое время.
У нас есть планировщик, основанный на планировщике Hardcodet (использует DateTimeOffset).Это работает очень хорошо.Однако в нашей базе данных мы храним только данные, достаточные для создания объекта DateTime (см. Ниже), а в нашем подклассе и сантехническом коде мы просто используем DateTime, поскольку изначально мы поддерживали только пользователей из Великобритании.
Этот планировщик отвечаетдля иммобилизации и мобилизации заводского оборудования.Поэтому очень важно, чтобы запланированные события выполнялись в соответствии с местным временем пользователя, настроенным на летнее время.
Пользователь вводит расписание на нашем веб-сайте;в настоящее время это сохраняется в базе данных как день недели, час и минута.Когда данные читаются, мы создаем объект DateTime для следующего вхождения этого дня, часа и минуты.Я свободен изменить структуру БД, чтобы дополнительно сохранить смещение или часовой пояс.
Когда наступают эти дата и время, планировщик отправляет команду (и повторяет попытку на некоторое время).Затем он снова запускается в тот же день и время на следующей неделе (хотя к тому времени служба фактически будет перезагружена и код снова запустится).
ВСЕ, что мне нужно сделать, это запуск запланированных событий вскорректированные по часовому поясу локальные дата и время для этого пользователя с помощью планировщика, который является подклассом из Hardcodet.Если DateTimeOffset действительно поддерживает DST, возможно, все, что мне нужно сделать, это сохранить смещение и изменить наш сантехнический код, чтобы использовать эту структуру, но у меня складывается впечатление, что это не так просто.(Возможно, мы сможем узнать текущий часовой пояс из GPS-положения станции, но это обсуждение другого дня:)).