2015-07-22 3 views
0

У меня есть таблица данных, в которой хранятся события. События сохраняются с местным временем. Я разрабатываю форму, в которой пользователь вводит дату и время в прошлом. После заполнения формы несколько раз мне нужно взять эти даты и время и найти события, которые произошли в это время.DateTime против двух временных зон?

Проблема в том, что пользователь вменяет свое местное время, а не мое. Я могу добавить смещение или выбор часового пояса. Но потом я понял, что экономия времени Day Light заставит все работать.

Я не могу изменить дату и время данных таблицы данных. Где я могу конвертировать их дату и время в мои, принимая во внимание летнее сбережение?

Благодаря

+1

Рассматривались ли даты хранения в формате UTC. Смысл, дайте пользователю указать дату в UTC и сохраните ее в UTC (в sqlserver) и выполните поиск на основе UTC. – gsk

+0

Может быть проще спросить пользователей о своем локальном времени и часовом поясе, а затем конвертировать в UTC на back-end. Зависит от сложности пользовательской базы. Но я согласен, что UTC - это путь. – Kevin

ответ

1

Предпосылка: Я действительно считаю, что идеальный способ, чтобы решить вашу проблему, это конвертировать ваши сохраненные DateTimes в UTC, а затем использовать его при поиске.

Но вы сказали, что не можете изменить их, поэтому использование ConvertTime для их преобразования во время запроса - это, вероятно, ваш лучший второй вариант.

  • Here вы можете найти все необходимые сведения.
  • Вы также можете посмотреть Noda Time, что весьма полезно при работе с часами и DateTime.
1

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

Без изменения данных, которые вы храните, невозможно преодолеть проблемы с летними днями. Лучшее, что вы можете сделать, это преобразовать время из часового пояса пользователя в UTC, а затем в свое местное время. Пример:

TimeZoneInfo TimeZone = TimeZoneInfo.GetSystemTimeZones().Where(t => t.StandardName == "W. Europe Standard Time").Single(); 
DateTime utc = TimeZoneInfo.ConvertTimeToUtc(inputTime); 
DateTime local = utc.ToLocalTime();