我有一个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
这现在可以节省,但有时只是(还没有找出决定它的因素)并且在错误的方向上偏移。我将对此进行编辑,因为我能够诊断出发生了什么。
答案 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。