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



我正在使用一个巡回演唱会网站的应用程序,其中所有时间(宣布时间、发售开始时间和活动开始时间)都是每个特定场地时区的本地时间。在适用的情况下,我使用用户输入的日期/时间,并运行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 %>

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

非常感谢。

您可以使用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)。因此,您需要一些服务器端编码来将其转换为正确的值。

我不确定我是否理解您想要做什么,但由于您正在存储@event.time_zone,您可以添加

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

到您的datetime_select表单字段。

这样的东西怎么样:

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

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

相关内容

  • 没有找到相关文章

最新更新