Строки часовых поясов в Rails 2.3.4 - PullRequest
0 голосов
/ 05 октября 2009

Как лучше всего справиться со следующей ситуацией:

У нас есть «администраторы», которые создают «события». Эти события могут быть общенациональными, то есть: разные часовые пояса. На данный момент есть меню выбора с текущим списком часовых поясов США. В таблице базы данных есть соответствующий столбец для выбранного часового пояса. Это так, чтобы администратор мог выбрать 5 вечера восточного, 5 вечера тихоокеанского и т. Д. Вместо того, чтобы пытаться выяснить GMT-эквивалент.

Приложение использует UTC в соответствии с файлом environment.rb в качестве часового пояса по умолчанию.

Если администратор выбирает «Восточное время (США и Канада)», выбранная метка даты все еще сохраняется как UTC (или по умолчанию в приложении). Мне нужно выполнить запросы, когда события не отображаются до указанного выше времени, включая часовой пояс.

Поскольку событиям нужен собственный часовой пояс, как следует сохранять данные? Первоначально я думал, что мне нужно обмануть Rails, прежде чем он сохранит значение, поэтому он сохраняет смещение UTC для часового пояса.

Это будет обработано в методах модели before_save и after_find. Но, похоже, это не работает, или, скорее, я что-то упускаю ..

1 Ответ

1 голос
/ 09 июля 2010

Вы упускаете простой факт. Время универсально. 13:00 в UTC - 1:00 вечера в UTC в любом месте. Вам даже не нужно хранить часовой пояс с каждым событием. Вам просто нужно позволить администраторам выбрать его для более удобного ввода времени. Что касается бэкэнда, он всегда в UTC. Вы, конечно, можете вводить время из другого часового пояса и выводить его в другом часовом поясе, но это все тот же «13:00 в Лондоне», независимо от того, как вы его искажаете. Поэтому, когда пользователь смотрит на события, вы можете просто сделать event_date

class ApplicationController < ActionController::Base
  before_filter :set_time_zone

  private
  def set_time_zone
    Time.zone = current_user.time_zone if current_user
  end
end

Тогда каждое значение времени, полученное из базы данных (например, event.date), будет автоматически преобразовано в домашний часовой пояс пользователя.

Или, может быть, я неправильно понял вопрос. :) Дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...