在Ruby on Rails中从控制器调用timezone方法

时间:2011-10-20 00:51:32

标签: ruby-on-rails

我有一个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 个答案:

答案 0 :(得分:2)

时区的工作方式是所有时间都以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

有关时区支持如何运作的良好屏幕演示,您可以观看here