Вызов методов часового пояса из контроллера в Ruby on Rails - PullRequest
1 голос
/ 20 октября 2011

У меня есть приложение rails, где часовой пояс устанавливается в application.rb:

config.time_zone = 'Pacific Time (US & Canada)'

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

@event.start_time = Time.zone.utc_to_local(@event.start_time)

Но, похоже, он не позволяет мне вызывать методы в Time.zone.Я также попробовал это с помощью ActionHelper :: Time, но, похоже, не сделал этого.Как получить доступ к этим методам из контроллеров?

РЕДАКТИРОВАТЬ: Я думаю, что часть проблемы в том, что я пытался сбросить @ event.start_time.Я изменил его так, чтобы оно было

@event = current_user.events.build(params[:event])
date = Date.parse(params[:event]["start_date"])

utc_start_time = DateTime.civil( date.year.to_i,
                                          date.month.to_i,
                                          date.day.to_i,
                                          params[:event]["start_hour_min(4i)"].to_i,
                                          params[:event]["start_hour_min(5i)"].to_i )

@event.start_time = Time.zone.utc_to_local(utc_start_time)
@event.save

Это теперь сохраняет, но только иногда (еще не выяснил, какие факторы определяют это) и смещается в неправильном направлении.Я отредактирую это, когда смогу диагностировать, что происходит дальше.

1 Ответ

2 голосов
/ 20 октября 2011

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

@event.local_start_time

Вы можете использовать это для поддержки часовых поясов в зависимости от пользователя, например, вы можете настроить что-то вроде фильтра ниже.

before_filter :set_user_time_zone

private

def set_user_time_zone
  Time.zone = current_user.time_zone if logged_in?
end

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

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