Изменения перехода на летнее время, влияющие на преобразование UTC

В основном я конвертирую локальные даты, хранящиеся в базе данных, в UTC. Но я где-то читал, что в 2007 году изменились правила перехода на летнее время. Функция Date.ToUniversalTime () по-прежнему работает правильно. В основном даты до 2007 года (когда новые правила вступили в силу) будут преобразованы правильно, а даты после этого - нет. Я здесь? Или .Net позаботится о преобразовании внутри себя, то есть в зависимости от различных правил перехода на летнее время?

Обновлено: даты хранятся в БД как местное время. Я конвертирую его в UTC. Поэтому дату, такую ​​как «9 марта 2005 года», следует преобразовать с использованием правил дневного света 2005 года, а не сегодняшних правил. Правила изменились в США в 2007 году. Таким образом, дата выходит неверно на один час.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
5 725
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Я ожидаю, что ToUniversalTime() учтет это. Вы пробовали и проверяли результат с датами до и после изменения летнего времени?

РЕДАКТИРОВАТЬ

Если вы знать смещение часового пояса всех дат в вашей БД, я окончательно рекомендую вам преобразовать их в UTC на уровне таблицы. Так вы избавитесь от множества головных болей. Преобразование в местное время для отображения проще.

Да, даты до 2007 года выходят неправильно в течение 2 месяцев, потому что .Net следует сегодняшним правилам экономии дневного света.

Malik Daud Ahmad Khokhar 21.10.2008 17:21
Ответ принят как подходящий

Это будет зависеть от того, какую версию .NET вы используете и, возможно, какую версию Windows вы используете. В .NET 3.5 есть класс TimeZoneInfo, который включает исторические изменения и т. д. - до этого, к сожалению, поддержка была гораздо более неоднородной.

Как это могло работать? TimeZoneInfo необходимо знать, когда значение было добавлено в базу данных, чтобы знать, какие правила применять.

Isak Savo 21.10.2008 17:24

Windows начала поддерживать модель расширенного часового пояса (с историческими изменениями) относительно недавно - возможно, с 2K3 или, может быть, даже с Vista, а затем с пакетами обновлений для более старых ОС. Поддержка .NET использовалась для следования старой модели (один набор правил, применяемых постоянно). TimeZoneInfo следует новой модели.

Jon Skeet 21.10.2008 17:28

Да, но предположим, что у меня есть эта дата в базе данных: «2005-03-10 03:30» (выраженное в «местном времени»). Как TimeZoneInfo может преобразовать эту дату во время UTC, не зная, какие правила DST использовались для ее сохранения в первое место?

Isak Savo 21.10.2008 17:29

Пришлось бы предположить, что правила перехода на летнее время были правильными на момент вставки. Есть некоторая двусмысленность (местное время встречается дважды и т. д.), Но это управляемо. Однако OP заявил, что база данных содержит значения UTC.

Jon Skeet 21.10.2008 17:31

@ Isak: Ему не нужно знать, когда значение было добавлено в базу данных. Только в том случае, если само значение настолько старое, и поскольку это значение является, проблем быть не должно.

Joel Coehoorn 21.10.2008 17:31

@jon: Думаю, вы упустили мою точку зрения. Есть ли гарантии, что значение в любой данной строке db совпадает с временем, когда оно было добавлено. Я имею в виду, что значение "2005-03-10 .." могло быть вставлено в базу данных вчера, используя вчерашние правила, насколько я знаю :)

Isak Savo 21.10.2008 17:37

Нет, база данных содержит значения местного времени. НЕ UTC. Я конвертирую их в формат UTC с помощью метода ToUniversalTime (). Проблема в том, что для такой даты, как «9 марта 2005 года», она должна быть преобразована в UTC с использованием правил дневного света 2005 года. Но вместо этого используются правила сегодняшнего дня. Так что даты выходят неправильно.

Malik Daud Ahmad Khokhar 21.10.2008 17:38

@ Исак: Да, теперь я понимаю, что вы имеете в виду. По сути, это вопрос «можем ли мы верить, что данные когда-либо были точными».

Jon Skeet 21.10.2008 17:42

@jon: в каком-то смысле да. Но нет ничего плохого в том, чтобы сделать «INSERT INTO mytable VALUES ('Moon Landing', '1969-06-29 12:34');» но это все равно вызовет вопрос - следует ли использовать правила DST с 1969 года (возможно) или какие-то другие правила (возможно). Зависит от того, когда он был вставлен

Isak Savo 21.10.2008 17:48

Хорошо, последнее разъяснение Ксардаса проясняет это. Мое беспокойство по поводу того, «когда он был вставлен», не относится к этому случаю.

Isak Savo 21.10.2008 17:50

Это зависит от того, как информация хранится в базе данных.

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

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

Время хранится как местное время в БД. Необходимо преобразовать в UTC в соответствии с правилами перехода на летнее время в то время.

Malik Daud Ahmad Khokhar 21.10.2008 17:24

Изменения правил перехода на летнее время не будут иметь значения - если вы переводите на местное время для отображения, и вы показываете старые даты / время, они будут неправильными :(

Jon Skeet 21.10.2008 17:24

@Jon: а, ты имеешь в виду ответ на вопрос «Была эта дата в период летнего времени или нет?»? Если да, убедитесь, что правила актуальны. Но не для преобразования в UTC (поскольку фактическое datetime в db содержит реальное смещение)

Isak Savo 21.10.2008 17:27

А, теперь я понимаю, что вы имеете в виду под «смещением UTC» - я думал, вы имели в виду «значение UTC».

Jon Skeet 21.10.2008 17:30

Летнее время может быть одной из 10 худших идей, которые у них когда-либо были. Я не могу придумать ни одной проблемы, которую решает эта концепция, но целую кучу проблем, которые она создает.

Tomalak 21.10.2008 17:33

@Tomalak: хе-хе, это только потому, что вы думаете о проблемах реализации, вызванных этим. Большинство людей не заботятся об этом, и дополнительный час солнечного света летом явно перевешивает это :)

Isak Savo 21.10.2008 17:40

Вот почему неправильно спрашивать "большинство людей" по какой-либо проблеме. :-D В Германии (как и в других местах, я полагаю) поезда останавливаются посреди ночи на один час, чтобы не нарушить расписание. Какого черта ?!

Tomalak 21.10.2008 17:53

@ Isak: DST не создает волшебный солнечный свет. Независимо от того, что показывают часы, дневной свет одинаков (без «лишнего часа»).

Dave Sherohman 21.10.2008 17:58

@ Дэйв: Вы, конечно, абсолютно правы. :) Хотя на ледяном севере, где я живу, вы теряете утренний час, когда большинство людей спит (~ 3 часа ночи), так что на практике это дополнительный час солнечного света.

Isak Savo 21.10.2008 19:24

Ненавижу это говорить, но ты облажался. Укусите пулю и измените даты в базе данных на UTC, пока проблема не усугубилась. Ваш код в мгновение ока превратится в кошмар особой математики даты, если вы продолжите попытки сохранять местное время в базе данных.

компромисс: хранить как местное время, так и время UTC в отдельных столбцах; по крайней мере, тогда у вас будет ссылка

см. эта почта, чтобы узнать больше о причинах никогда не хранить время db по местному времени

Посмотрите, поможет ли вам вообще http://geekswithblogs.net/ewright/archive/2004/09/14/11180.aspx.

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