Подтвердить что ты не робот

Как DateTimeOffset справляется с летним временем?

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

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

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

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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