Rails - 指定时区内的日期时间选择
我正在为一个音乐会巡回网站提供应用程序,其中所有时间(通知时间,开售时间和活动开始时间)都是每个特定场地的时间区。在适用的情况下,我输入用户输入的日期/时间并运行before_filter以设置适当的时区,以便所有内容都以UTC格式保存在数据库中。对于'新'形式,并在索引和显示动作中显示时间,完全没有问题。当数据被带出数据库并进入视图时,我使用in_time_zone根据特定场地进行调整。Rails - 指定时区内的日期时间选择
唯一的问题是在编辑窗体上。日期/时间选择以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 %>
。
不幸的是,我还没有找到正确的方法来做到这一点。你有什么想法值得一试?
非常感谢。
怎么是这样的:
# change PST to correct zone abbrev.
new_zone = ActiveSupport::TimeZone.new("PST")
@performance.start_datetime = @performance.start_datetime.in_time_zone(new_zone)
我不知道如果我理解你想做的事,但因为要存储的@ event.time_zone,您可以添加
:default => start_time.in_time_zone(@event.time_zone)
到您的datetime_select表单字段。
我刚刚注意到这是一个旧帖子,但是: 如果我是你,我会使用虚拟属性来表示场地的日期时间。例如,您可以将一个属性添加到名为adjusted_start_time的效果。
您可以使用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)。 因此,您需要一些服务器端编码将其转换为正确的值。