错误的自动时间

时间:2016-04-26 19:10:46

标签: ruby-on-rails timezone

在我的申请表中我已经

config.time_zone = 'Europe/Prague'

考虑到我的时间来源

<%= f.input :end_at, as: :string %> <!-- shortened -->

这会生成12:31,05:59等字符串。当Time对象被创建为Slot模型的属性时,它会得到错误的时区。生成像

slot = Slot.new({end_at: params[:end_at]})

模型是这样的

create_table :slots do |t|
  t.time :end_at
end

然后当我尝试

slot.end_at.zone

它返回&#34; UTC&#34;所以要么我不理解轨道中的时间概念,要么出现问题。不应该是&#34; CEST&#34;?从我得到的,UTC仅在数据库中使用,当你从那里获得它时,它被转换为本地时间,也在本地时间创建时间对象。这在此失败并将CEST时间保存到数据库,因为UTC导致错误的时间。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

这是Rails中的known issue。我自己实际上将此视为预期行为,因为time列具有 - 根据定义 - 其中没有日期信息。所以'10:00'可能是在布拉格夏天保存时的上午10点CEST,但是在其他时区保存了一些其他时间的完全不同的时间 - 但在数据库中它始终只是上午10点。想象一下,用这样的时间打开一个6个月大的记录并再次重新保存 - 这会改变数据库中的值,这对我来说似乎很奇怪。

无论如何,您可以简单地强制Rails在保存时将时间识别为“今天”的时间:

slot = Slot.new({end_at: Time.parse(params[:end_at])})

这将正确地将时间解析为今天在配置的时区中的时间,并将其转换为UTC的表示保存到数据库。