Отображение DateTimeOffset после изменения летнего времени - PullRequest
4 голосов
/ 21 июля 2011

У меня есть вопрос о DateTimeOffset и летнем времени. Чтобы объяснить мой вопрос, давайте предположим, что сейчас дата и время:

11/6/2010  10:15:00 AM 

Если я запускаю этот код:

DateTimeOffset myTime = DateTimeOffset.Now;
Console.WriteLine("Local time: " + myTime.ToLocalTime().DateTime);

Тогда я получаю такой результат:

Местное время: 06.11.2010 10:15:00

Это означает, что событие произошло в 10:15 утра (мой часовой пояс - горное летнее время (смещение -6)).

Итак, затем я сохраняю этот DateTimeOffset в моей базе данных SQL Server 2008 (как DateTimeOffset). На следующий день я хочу показать это пользователю. Но теперь летнее время истекло.

Если я запусту вышеупомянутую WriteLine с сохраненным значением off (из предыдущего дня), что будет отображаться?

Смещение, хранящееся в базе данных, равно -6. Но теперь, когда летнее время закончилось, текущее смещение составляет -7. Итак, насколько я понимаю документацию , сначала она преобразует мое время в время UTC (поэтому требуется 10:15 утра и добавляется 6 часов (16:15). Затем будет вычтено текущее смещение местное время (4:15 вечера - 7 = 9:15 утра).

Так что, если я правильно понимаю свою математику, теперь, когда я покажу свое событие, оно покажет, что оно произошло в 9:15, а не в 10:15.

Это не хорошо. Я хочу хранить информацию о часовом поясе, но мне нужно, чтобы мое время оставалось неизменным в том же часовом поясе. (Это означает, что если событие произошло в 10:15 утра в штате Юта, то в следующий раз, когда я посмотрю на него (в штате Юта), мне нужно убедиться, что это произошло в 10:15, независимо от того, произошло ли изменение летнего времени. .

Не могу думать, что я первый, кто столкнулся с этой проблемой. Что другие делают, чтобы это исправить? (Или у меня неверные факты?)

1 Ответ

6 голосов
/ 21 июля 2011

Нет, это не добавит текущее смещение - оно добавит смещение на эту дату , которое все еще равно -6.Таким образом, он по-прежнему должен отображать 10:15, потому что он знает дату , и, следовательно, правила часового пояса, действующие на эту дату.и идентификатор часового пояса отдельно, кстати.Если вы храните часовой пояс, то использование DateTimeOffset не будет особенно полезным в течение только даты / времени UTC.(С другой стороны, более ясно, что действительно представляет момент времени - DateTime - ужасно запутанный тип, который не позволяет вам легко выразить то, что вы пытаетесь изобразить.)

Конечно, я лично призываю вас взглянуть на Noda Time , который, по моему очень предвзятому мнению, является более четким API даты / времени, чем встроенный ... но который не 'Т вполне готов к использованию.(Мы добираемся там, хотя ...)

...