在我的申请表中我已经
了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导致错误的时间。
我做错了什么?
答案 0 :(得分:0)
这是Rails中的known issue。我自己实际上将此视为预期行为,因为time
列具有 - 根据定义 - 其中没有日期信息。所以'10:00'
可能是在布拉格夏天保存时的上午10点CEST,但是在其他时区保存了一些其他时间的完全不同的时间 - 但在数据库中它始终只是上午10点。想象一下,用这样的时间打开一个6个月大的记录并再次重新保存 - 这会改变数据库中的值,这对我来说似乎很奇怪。
无论如何,您可以简单地强制Rails在保存时将时间识别为“今天”的时间:
slot = Slot.new({end_at: Time.parse(params[:end_at])})
这将正确地将时间解析为今天在配置的时区中的时间,并将其转换为UTC的表示保存到数据库。