使用in_time_zone Rails 4忽略夏令时

时间:2016-04-12 20:50:54

标签: ruby-on-rails ruby-on-rails-4

我有一个令人沮丧的问题,我似乎无法缩小范围。我搜索了许多类似的文章,但它们并不足以解决我的问题。我试图从数据库中抽出时间并在多个时区显示它。我的Rails应用程序使用UTC作为默认值。这就是我正在做的事情:

在创建操作中,我将获取将保存在我的数据库中的时间列中的时间字符串:

params[:schedule][:start] = "09:00"
Time.zone = "Central Time (US & Canada)"
@schedule.start = Time.zone.parse(params[:schedule][:start])

以上格式化时间:

2016-04-12 09:00:00 -0500

它在DB中保存为:

2000-01-01 14:00:00

这没有时间偏移,这很好,因为我知道它在UTC中。当我去显示时间时会发生问题:

@schedule.start.in_time_zone("Central Time (US & Canada)")

返回:

Sat, 01 Jan 2000 08:00:00 CST -06:00

现在,由于这是一个时间栏,我不在乎日期。我打算将值格式化为仅显示时间。但是,它正在显示当前CDT的CST。

我无法弄清楚为什么会这样。正如我所说,我没有在application.rb或其他任何地方设置时区,我只在创建操作上设置时区,在移动到新操作时应该没问题。

任何有关澄清这一点的帮助都很棒!

这似乎是因为当存储时间时,它与2000-01-01中的日期一起存储,这似乎是它使用CST的原因。如何将其转换为特定时区时忽略日期,还是需要将列类型更改为DateTime才能使其正常工作?

2 个答案:

答案 0 :(得分:0)

显示CST只是因为时间是从数据库读取,包括存储日期,即它读作2000年1月1日09:00。

我猜你必须在阅读属性时解析时间。您可以在模型中使用辅助方法,例如:

# schedule model
def start_in_zone(zone)
  self.start.strftime("%H:%M").in_time_zone(zone)
end

这将仅占用存储时间的小时和分钟部分,并在给定时区内解析日期设置为今天。见这个例子:

"Sat, 01 Jan 2000 08:00:00".to_time.
     strftime("%H:%M").
     in_time_zone("Central Time (US & Canada)")
# => Tue, 12 Apr 2016 08:00:00 CDT -05:00

答案 1 :(得分:0)

重要的是它是CST还是CDT意味着你做,在某种程度上关心日期。虽然我不熟悉该地区夏令时的确切规则,但我知道1月1日是冬季中期,绝对不会是夏令时。

将相关日期添加到@schedule中,然后再将其放入时区,它应该可以解决问题。