Rails - 在指定时区中选择日期时间

时间:2011-06-06 01:04:34

标签: ruby-on-rails ruby-on-rails-3 actionview actionviewhelper

我正在使用一个音乐会巡回网站的应用程序,其中所有时间(公告时间,开始时间和活动开始时间)都在每个特定地点的时区本地。我将用户输入的日期/时间视为适用,并运行before_filter来设置适当的时区,以便所有内容都以UTC格式存储在数据库中。对于“新”表单以及在索引和显示操作中显示时间,完全没问题。当数据从数据库带回到视图中时,我使用in_time_zone来根据特定的场地进行调整。

唯一的问题是在编辑表单上。日期/时间选择以UTC显示数据。当我在网站上工作时,我会进行心理调整,但对于其他人而言,这是令人困惑的。我想按照以下方式做点什么:

<%= f.datetime_select :start_datetime.in_time_zone(@event.time_zone) %>

或者,在控制器中:

def edit
  @performance = Performance.find(params[:id])
  @event = @performance.event
  @performance.start_datetime = @performance.start_datetime.in_time_zone(@event.time_zone)
end

然后简单地<%= f.datetime_select :start_datetime %>

不幸的是,我没有找到正确的方法来做到这一点。你有什么值得尝试的想法吗?

非常感谢。

4 个答案:

答案 0 :(得分:3)

您可以使用datetime_select的默认方法,如下所示:

%br
= f.label :req_sess_start, "Session starts at"
= f.datetime_select(:req_sess_start, :start_year => 2010, :ampm => true, :default => 0.days.from_now.in_time_zone(@timezone))

由于显示的默认值,客户端将假定必须在他/她的本地时区输入时间,但是...... 此值实际上将在您的应用程序的默认时区(在application.rb中提供,默认为UTC)。 因此,您需要一些服务器端编码才能将其转换为正确的值。

答案 1 :(得分:1)

我不确定我是否理解你想做什么,但既然你正在存储@ event.time_zone,你可以添加

:default => start_time.in_time_zone(@event.time_zone)

到你的datetime_select表单字段。

答案 2 :(得分:0)

这样的事情怎么样:

# change PST to correct zone abbrev.
new_zone = ActiveSupport::TimeZone.new("PST")
@performance.start_datetime = @performance.start_datetime.in_time_zone(new_zone)

答案 3 :(得分:0)

我刚刚注意到这是一个旧帖子但是: 如果我是你,我会使用虚拟属性来表示场地的日期时间。例如,您可以向称为adjust_start_time的性能添加属性。