我有一个令人沮丧的问题,我似乎无法缩小范围。我搜索了许多类似的文章,但它们并不足以解决我的问题。我试图从数据库中抽出时间并在多个时区显示它。我的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才能使其正常工作?
答案 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
中,然后再将其放入时区,它应该可以解决问题。