Как DateTimeOffset работает с летним временем?

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

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

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

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

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

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

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

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

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

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам