time_select form helper将新时间对象解释为UTC而不是配置的时区

时间:2012-01-05 16:26:26

标签: ruby-on-rails ruby-on-rails-3 time timezone

我遇到的对我来说似乎是一个简单的问题,但我无法弄清楚我做错了什么。在我的应用中,用户可以通过简单的form_for添加他们的课程。他们可以输入课程讲座的start_time和end_time,如下所示:

<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 AM EST / 15:00 UTC。我在这里错过了什么?似乎我想要发生的事情应该是可能的。

2 个答案:

答案 0 :(得分:2)

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

Tim Brandes建议:

  

也许这会对你有所帮助:Timezone with rails 3 ...在处理时区时,我从未使用过time_select但总是使用datetime_select,这可能是一个问题,但似乎不太可能。

适用于Philip V的解决方案:

  

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

答案 1 :(得分:0)

我正在努力解决同样的问题。但后来我意识到我不需要Time对象的时区信息。

正如您所说,数据库将其存储为UTC,但我们需要对此数据执行的非常重要的事情是:

course.start_time.hour
course.start_time.min

这与时区无关。 (8小时是午夜8小时,无论你比较的是什么午夜.30小时是从小时0分钟开始的30分钟。无论你在哪个时区使用)。

因此,在大多数需要时间存储结构的应用中,比如知道重复事件何时开始或结束,存储定时器的值,或者是时间在比赛中,你可以使用数据库返回的UTC时间没有问题。