自动解析时间错误



在我的应用程序中,我有

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 的表示形式保存到数据库。

相关内容

  • 没有找到相关文章

最新更新