我正在使用一个音乐会巡回网站的应用程序,其中所有时间(公告时间,开始时间和活动开始时间)都在每个特定地点的时区本地。我将用户输入的日期/时间视为适用,并运行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 %>
。
不幸的是,我没有找到正确的方法来做到这一点。你有什么值得尝试的想法吗?
非常感谢。
答案 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的性能添加属性。