time_select表单帮助程序将新时间对象解释为UTC,而不是配置的时区



我遇到了一个对我来说似乎很简单的问题,但我不知道我做错了什么。在我的应用程序中,用户可以通过一个简单的form_for添加他们的课程。他们可以输入课程讲座的开始时间和结束时间,如下所示:

<div class="field">
  Start Time<br />
  <%= time_select :course, :start_time, { :minute_step => 5, :ampm => true } %>
</div>
<div class="field">
  End Time<br />
  <%= time_select :course, :end_time, { :minute_step => 5, :ampm => true } %>
</div>

我在application.rb中配置了我的时区,将其设置为东部时间,当created_at返回到正确的时区时,这似乎可以正常工作。

然而,我遇到的问题是,start_time和end_time是以UTC的形式输入数据库的。因此,当用户选择在上午10点开始上课时,输入的是10 UTC,而不是美国东部时间上午10点/15:00 UTC。我在这里错过了什么?我想发生的事情似乎是可能的。

总结评论中的答案,以便从"未回答"过滤器中删除此问题:

Tim Brandes建议:

也许这对你有帮助:时区与轨道3。。。我从来没有使用过time_select,但在处理时区时总是使用datetime_select,也许这可能是个问题,但似乎不太可能。

适用于Philip V的解决方案:

我的start_time和end_time没有保存在时区内,而是保存为UTC时间。。。我将start_time和end_time的列类型更改为datetime,这样就解决了我遇到的问题。我想时间列只允许UTC。

我也遇到了同样的问题。但后来我意识到我不需要Time对象的时区信息。

正如您所说,数据库将其存储为UTC,但我们需要对这些数据做的真正重要的事情是:

course.start_time.hour
course.start_time.min

这是独立于时区的。(8小时是从午夜开始的8小时,无论你比较的是什么午夜。30分钟是从一小时的0分钟开始的30分钟。无论你使用的是哪个时区)。

因此,在大多数需要时间存储结构的应用程序中,比如知道重复事件何时开始或结束,存储计时器的值或比赛中一圈的时间,您可以使用数据库返回的UTC时间,而不会出现问题。

最新更新