Как DateTimeOffset работает с летним временем? - PullRequest
21 голосов
/ 26 сентября 2011

Я знаю, что DateTimeOffset хранит дату / время в формате UTC и смещение.Я также знаю из этой записи в блоге MSDN , что DateTimeOffset следует использовать для «работы с переходами на летнее время».

Я пытаюсь понять, как именно работает DateTimeOffset (и)с летним временем ».Насколько я понимаю, мало того, что переход на летнее время является политическим решением и не может быть выведен из чисто компромисса.Как может получиться, что эта структура дружественна к DST, если она хранит только смещение?

Я понимаю, что может быть способ использовать класс TimeZoneInfo в сочетании с DateTimeOffset.Как мне это сделать?

Наконец, есть ли какие-нибудь лучшие способы, которыми я мог бы достичь следующего?

(я видел несколько сообщений от Джона Скита о Noda-Time но я понимаю, что это еще не готово к производству, и я не знаю, будет ли оно хорошо интегрировано в наше существующее решение).

Вот наш сценарий.Сервер по неудачным старым причинам работает по британскому времени.У нас есть клиенты, которые начинают работать из Австралии, которая имеет несколько часовых поясов.Другие страны могут подключиться к сети в любое время.

У нас есть планировщик, основанный на планировщике Hardcodet (использует DateTimeOffset).Это работает очень хорошо.Однако в нашей базе данных мы храним только данные, достаточные для создания объекта DateTime (см. Ниже), а в нашем подклассе и сантехническом коде мы просто используем DateTime, поскольку изначально мы поддерживали только пользователей из Великобритании.

Этот планировщик отвечаетдля иммобилизации и мобилизации заводского оборудования.Поэтому очень важно, чтобы запланированные события выполнялись в соответствии с местным временем пользователя, настроенным на летнее время.

Пользователь вводит расписание на нашем веб-сайте;в настоящее время это сохраняется в базе данных как день недели, час и минута.Когда данные читаются, мы создаем объект DateTime для следующего вхождения этого дня, часа и минуты.Я свободен изменить структуру БД, чтобы дополнительно сохранить смещение или часовой пояс.

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

ВСЕ, что мне нужно сделать, это запуск запланированных событий вскорректированные по часовому поясу локальные дата и время для этого пользователя с помощью планировщика, который является подклассом из Hardcodet.Если DateTimeOffset действительно поддерживает DST, возможно, все, что мне нужно сделать, это сохранить смещение и изменить наш сантехнический код, чтобы использовать эту структуру, но у меня складывается впечатление, что это не так просто.(Возможно, мы сможем узнать текущий часовой пояс из GPS-положения станции, но это обсуждение другого дня:)).

1 Ответ

27 голосов
/ 26 сентября 2011

DateTimeOffset сам по себе не DST-осведомленный, но TimeZoneInfo есть. DateTimeOffset представляет фиксированный момент времени - поэтому вы получаете до a DateTimeOffset через что-то, что известно о часовом поясе. Другими словами, если бы я попросил DateTimeOffset сейчас в Великобритании, я бы получил что-то со смещением +1 час от UTC. Если бы я попросил DateTimeOffset в декабре в Великобритании в течение некоторого времени, я бы получил что-то со смещением 0 часов от UTC.

Если вы измените свою базу данных, включив смещение и , вы создадите DateTimeOffset из выбранного пользователем DateTime (который должен быть вида "не указан") и его часового пояса, тогда это должно дать вам правильное смещение с учетом DST.

Следует помнить одну вещь: если я планирую что-то сейчас на «2 года» и вы определите смещение сейчас, то это смещение может быть неправильным в будущем - например, правительство может измениться, когда применяется DST, и, очевидно, это не изменит того, что хранится в вашей базе данных.

...