2013-09-03 2 views
1

У меня возникли проблемы с поддержкой поддержки часовых поясов Rails, когда дело доходит до летнего времени.Rails игнорировать летнее время

Я храню все база данных раз в UTC. Пользовательские часовые пояса сохраняются так, чтобы они отображались непосредственно обратно до значений ActiveSupport::TimeZone (то есть Central Time (US & Canada)).

Я хочу полностью игнорировать переход на летнее время. Если событие начинается с 5:30pm, всегда начинается с 5:30pm, действует ли летнее время или нет.

Возможно ли, что все время хранится равномерно, чтобы получить время базы данных и отображать их локально, чтобы дневное сбережение полностью игнорировалось? Есть ли какие-нибудь проблемы, с которыми я столкнулся, игнорируя переход на летнее время?

+0

У вас есть способ сделать это? У меня есть ситуация, в которой мне нужно игнорировать часовые пояса (оборудование, которое отправляет данные, не меняет свой час на DST, поэтому у нас есть смещение за 1 час во всех полученных данных). – lcguida

ответ

5

Я не хочу звучать педантичный, но ...

Я хочу, чтобы полностью игнорировать летнее время.

Ну, тогда вы будете сами по себе. Несмотря на наши лучшие надежды и пожелания, большая часть реального мира использует летнее время. You can get a quick primer here.

Если мероприятие начинается в 17:30, оно всегда начинается в 17:30, независимо от того, действует ли летнее время или нет.

5:30 для кого? Если вы говорите 5:30 UTC, тогда обязательно. Но если вы говорите 5:30 в центральное время США, тогда вам нужно учитывать DST. В противном случае, половина года люди появятся на вашем мероприятии по тому, что, по их мнению, 5:30, и вы думаете, что это 6:30.

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

Вы сохраняете время в UTC, что хорошо. Когда вы показываете их локально, вы должны не игнорировать DST.

Есть ли какие-либо проблемы, с которыми я столкнулся, игнорируя переход на летнее время?

Да, люди обычно это не понимают. Обычно ожидается, что если вы ссылаетесь на местное время, то вы имеете в виду время, которое является местным для их. Если вы не включите DST в этот расчет, то у вас будет несогласие о том, во сколько вы говорите.

Другим советом, вы можете рассмотреть использование TZInfo gem вместо ActiveSupport::TimeZone. Затем вы будете хранить выбор часового пояса с помощью идентификаторов IANA, таких как America/Chicago. Они распознаются вне Rails.

По какой-то необъяснимой причине люди ActiveSupport считают, что они должны ограничить часовые пояса 146 значениями, которые, по их мнению, были «значимыми». Но они не объяснили свой процесс, и они, похоже, не поддерживают работу. I've asked why, но не получили подробного ответа.

Возможно, вы также пожелаете ознакомиться с обзором the timezone tag wiki.

+0

Вы на 100% прав! Я нашел какой-то старый код, написанный до того, как я попал в проект, и разработчик заставил смещение часового пояса прежде, чем он был сохранен в 'UTC'. Этот код искал смещение для данного часового пояса и заставлял это смещение независимо от того, было ли время вставлено в DST или нет (или оно зависело от значения Date/Time.now', чтобы определить смещение DST). Я исправил код, и все даты вставлены соответствующим образом. Спасибо за то, что вы выяснили необходимость в DST. – bschaeffer

+0

Нет проблем. Проблемы с датой/временем сложны. Многие действительно великие разработчики все еще ошибаются. Спросите еще раз, если у вас есть другие проблемы в будущем! –

1

Rails собирается конвертировать ваши даты/время в часовой пояс приложения или часовой пояс пользователя (при условии, что у вас есть какой-то фильтр для использования user.timezone); и это WILL включает манипуляции на основе DST.

Вам нужно будет переопределить это поведение и есть, вероятно, несколько вариантов:

  1. Посмотрите в использовании Time.dst? для того, чтобы вычитать/добавить время на то, что извлечен из базы данных
  2. Посмотрите в использовании skip_time_zone_conversion_for_attributes в AR и сделать преобразование себя через виртуальные атрибуты
  3. магазин время как нечто иное, чем дата/время; возможно, в качестве отдельного поля от даты в просто нормальный формат строки
Смежные вопросы