【问题标题】:time_select form helper interprets new time object as UTC not as configured time zonetime_select 表单助手将新时间对象解释为 UTC 而不是配置的时区
【发布时间】:2012-02-03 11:33:24
【问题描述】:

我遇到了对我来说似乎很简单的问题,但我无法弄清楚我做错了什么。在我的应用程序中,用户可以通过一个简单的 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 AM EST / 15:00 UTC。我在这里想念什么?看来我想要发生的事情应该是可能的。

【问题讨论】:

  • 我实际上认为我有相反的问题。我的 start_time 和 end_time 没有保存在时区内,而是保存为 UTC 时间。
  • 我从来没有使用过 time_select 但在处理时区时总是使用 datetime_select,也许这可能是个问题,但似乎不太可能。
  • 你的想法实际上让我走上了正轨。我将 start_time 和 end_time 的列类型更改为 datetime,这解决了我遇到的问题。我猜时间列只允许 UTC。
  • @TimBrandes 或 PhilipV - 如果您想将解决方案概括为您自己的答案,我将删除我的答案。 (请参阅meta.stackexchange.com/questions/90263/… 详细说明为什么这会有所帮助。)谢谢!

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


【解决方案1】:

总结来自 cmets 的答案,以便从“未回答”过滤器中删除此问题:

Tim Brandes推荐:

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

适用于 Philip V 的解决方案:

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

【讨论】:

    【解决方案2】:

    我也在为同样的问题而苦苦挣扎。但后来我意识到我不需要 Time 对象的时区信息。

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

    course.start_time.hour
    course.start_time.min
    

    这是时区无关的。 (8 小时是从午夜开始的 8 小时,无论您比较的是哪个午夜。30 分钟是从一小时的第 0 分钟开始的 30 分钟。无论您使用的那个小时在哪个时区)。

    因此,在大多数需要时间存储结构的应用程序中,例如知道循环事件何时开始或结束、存储计时器的值或时间比赛圈数,您可以使用数据库返回的 UTC 时间,没有问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 2023-04-02
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      相关资源
      最近更新 更多