В основном я конвертирую локальные даты, хранящиеся в базе данных, в UTC. Но я где-то читал, что в 2007 году изменились правила перехода на летнее время. Функция Date.ToUniversalTime () по-прежнему работает правильно. В основном даты до 2007 года (когда новые правила вступили в силу) будут преобразованы правильно, а даты после этого - нет. Я здесь? Или .Net позаботится о преобразовании внутри себя, то есть в зависимости от различных правил перехода на летнее время?
Обновлено: даты хранятся в БД как местное время. Я конвертирую его в UTC. Поэтому дату, такую как «9 марта 2005 года», следует преобразовать с использованием правил дневного света 2005 года, а не сегодняшних правил. Правила изменились в США в 2007 году. Таким образом, дата выходит неверно на один час.





Я ожидаю, что ToUniversalTime() учтет это. Вы пробовали и проверяли результат с датами до и после изменения летнего времени?
РЕДАКТИРОВАТЬ
Если вы знать смещение часового пояса всех дат в вашей БД, я окончательно рекомендую вам преобразовать их в UTC на уровне таблицы. Так вы избавитесь от множества головных болей. Преобразование в местное время для отображения проще.
Это будет зависеть от того, какую версию .NET вы используете и, возможно, какую версию Windows вы используете. В .NET 3.5 есть класс TimeZoneInfo, который включает исторические изменения и т. д. - до этого, к сожалению, поддержка была гораздо более неоднородной.
Как это могло работать? TimeZoneInfo необходимо знать, когда значение было добавлено в базу данных, чтобы знать, какие правила применять.
Windows начала поддерживать модель расширенного часового пояса (с историческими изменениями) относительно недавно - возможно, с 2K3 или, может быть, даже с Vista, а затем с пакетами обновлений для более старых ОС. Поддержка .NET использовалась для следования старой модели (один набор правил, применяемых постоянно). TimeZoneInfo следует новой модели.
Да, но предположим, что у меня есть эта дата в базе данных: «2005-03-10 03:30» (выраженное в «местном времени»). Как TimeZoneInfo может преобразовать эту дату во время UTC, не зная, какие правила DST использовались для ее сохранения в первое место?
Пришлось бы предположить, что правила перехода на летнее время были правильными на момент вставки. Есть некоторая двусмысленность (местное время встречается дважды и т. д.), Но это управляемо. Однако OP заявил, что база данных содержит значения UTC.
@ Isak: Ему не нужно знать, когда значение было добавлено в базу данных. Только в том случае, если само значение настолько старое, и поскольку это значение является, проблем быть не должно.
@jon: Думаю, вы упустили мою точку зрения. Есть ли гарантии, что значение в любой данной строке db совпадает с временем, когда оно было добавлено. Я имею в виду, что значение "2005-03-10 .." могло быть вставлено в базу данных вчера, используя вчерашние правила, насколько я знаю :)
Нет, база данных содержит значения местного времени. НЕ UTC. Я конвертирую их в формат UTC с помощью метода ToUniversalTime (). Проблема в том, что для такой даты, как «9 марта 2005 года», она должна быть преобразована в UTC с использованием правил дневного света 2005 года. Но вместо этого используются правила сегодняшнего дня. Так что даты выходят неправильно.
@ Исак: Да, теперь я понимаю, что вы имеете в виду. По сути, это вопрос «можем ли мы верить, что данные когда-либо были точными».
@jon: в каком-то смысле да. Но нет ничего плохого в том, чтобы сделать «INSERT INTO mytable VALUES ('Moon Landing', '1969-06-29 12:34');» но это все равно вызовет вопрос - следует ли использовать правила DST с 1969 года (возможно) или какие-то другие правила (возможно). Зависит от того, когда он был вставлен
Хорошо, последнее разъяснение Ксардаса проясняет это. Мое беспокойство по поводу того, «когда он был вставлен», не относится к этому случаю.
Это зависит от того, как информация хранится в базе данных.
Будем надеяться, что данные в базе данных содержат смещение по всемирному координированному времени, и если это так, любые изменения правил перехода на летнее время не будут иметь значения.
Если смещение UTC неизвестно, то практически невозможно узнать, как преобразовать его в UTC. Например, если время хранится как целое число без метаданных, тогда системе необходимо знать, что когда было добавлено в базу данных, чтобы иметь возможность вычислить соответствующую временную метку UTC.
Время хранится как местное время в БД. Необходимо преобразовать в UTC в соответствии с правилами перехода на летнее время в то время.
Изменения правил перехода на летнее время не будут иметь значения - если вы переводите на местное время для отображения, и вы показываете старые даты / время, они будут неправильными :(
@Jon: а, ты имеешь в виду ответ на вопрос «Была эта дата в период летнего времени или нет?»? Если да, убедитесь, что правила актуальны. Но не для преобразования в UTC (поскольку фактическое datetime в db содержит реальное смещение)
А, теперь я понимаю, что вы имеете в виду под «смещением UTC» - я думал, вы имели в виду «значение UTC».
Летнее время может быть одной из 10 худших идей, которые у них когда-либо были. Я не могу придумать ни одной проблемы, которую решает эта концепция, но целую кучу проблем, которые она создает.
@Tomalak: хе-хе, это только потому, что вы думаете о проблемах реализации, вызванных этим. Большинство людей не заботятся об этом, и дополнительный час солнечного света летом явно перевешивает это :)
Вот почему неправильно спрашивать "большинство людей" по какой-либо проблеме. :-D В Германии (как и в других местах, я полагаю) поезда останавливаются посреди ночи на один час, чтобы не нарушить расписание. Какого черта ?!
@ Isak: DST не создает волшебный солнечный свет. Независимо от того, что показывают часы, дневной свет одинаков (без «лишнего часа»).
@ Дэйв: Вы, конечно, абсолютно правы. :) Хотя на ледяном севере, где я живу, вы теряете утренний час, когда большинство людей спит (~ 3 часа ночи), так что на практике это дополнительный час солнечного света.
Ненавижу это говорить, но ты облажался. Укусите пулю и измените даты в базе данных на UTC, пока проблема не усугубилась. Ваш код в мгновение ока превратится в кошмар особой математики даты, если вы продолжите попытки сохранять местное время в базе данных.
компромисс: хранить как местное время, так и время UTC в отдельных столбцах; по крайней мере, тогда у вас будет ссылка
см. эта почта, чтобы узнать больше о причинах никогда не хранить время db по местному времени
Посмотрите, поможет ли вам вообще http://geekswithblogs.net/ewright/archive/2004/09/14/11180.aspx.
Да, даты до 2007 года выходят неправильно в течение 2 месяцев, потому что .Net следует сегодняшним правилам экономии дневного света.