在我的应用程序中,我有
config.time_zone = 'Europe/Prague'
看看我的时间起源在哪里
<%= f.input :end_at, as: :string %> <!-- shortened -->
这会生成 12:31、05:59 等字符串。当时间对象被创建为插槽模型的属性时,它会得到错误的时区。生成像
slot = Slot.new({end_at: params[:end_at]})
其中模型是这样的
create_table :slots do |t|
t.time :end_at
end
然后当我尝试时
slot.end_at.zone
它返回"UTC",所以要么我不明白 rails 中的时间概念,要么有问题。不应该是"CEST"吗?据我所知,UTC仅在数据库中使用,当您将其从那里取出时,它会转换为本地时间,并且还会在本地时间创建Time对象。这在这里失败,并将 CEST 时间节省到 UTC 数据库的时间,从而导致错误的时间。
我做错了什么?
这是 Rails 中的一个已知问题。我自己实际上认为这是预期的行为,因为time
列根据定义没有日期信息。因此,在布拉格的夏天保存时,'10:00'
可能是上午 10 点 CEST,但在一年中的其他时区保存时,时间完全不同 - 但在数据库中,它总是只是上午 10 点。想象一下,用这样的时间打开一个 6 个月的记录并再次重新保存它 - 这会改变数据库中的值,这对我来说似乎很奇怪。
无论如何,您可以简单地强制 Rails 在保存时将时间识别为"今天"的时间:
slot = Slot.new({end_at: Time.parse(params[:end_at])})
这会将时间正确解析为配置时区中的当前时间,并将其转换为 UTC 的表示形式保存到数据库。