【问题标题】:Rails time type and time zonesRails 时间类型和时区
【发布时间】:2012-03-03 08:12:57
【问题描述】:

我有一个存储时间值的 Rails 应用,我在 config/application.rb 中设置了时区。

这适用于日期时间列,但时间列以 UTC 显示时间,而不是指定的时区。

这两个示例中的时间都在数据库中存储为 20:50 (UTC),但是当我在视图中显示它时,时间列显示为 UTC,并且日期时间列正确显示在所选时区中。

time2:     2000-01-01 20:50:00 UTC
datetime2: 2012-02-09 21:50:00 +0100

这是预期的行为吗?时间类型不应该也使用配置的时区吗?

【问题讨论】:

    标签: ruby-on-rails timezone


    【解决方案1】:

    ActiveRecord 使用TimeWithZone,其中localtimeutcutc? 等方法可能会对您有所帮助。

    【讨论】:

    • 所以如果一个属性是时间类型的,它不会自动转换到视图中配置的时区,但是你必须写类似 ?但是日期时间的属性会自动转换,您只需键入 。为什么这两种类型有区别?
    【解决方案2】:

    是的,这是预期的行为。 Rails (ActiveRecord) 以 UTC 存储时间,然后在视图中呈现时将它们转换为 Time.zone 设置的任何时区。

    【讨论】:

    • 是的,我知道,正如我在问题中所说,我已经设置了一个时区,并且上面的两个示例都以 UTC(20:50)存储在数据库中,但是当显示在一个视图,只有 datetime 属性被转换为时区。 ActiveRecord 不转换时间属性吗?只是日期时间属性?
    • 嗯,一个日期不应该(不会)有一个与之关联的时区。只有时间或日期时间。所以是的,这是有道理的。
    • 我没有提到任何关于日期的内容,只是时间和日期时间。再一次,正如我在问题中所说,我已经配置了一个时区,并且我有一个时间和一个日期时间作为 UTC 存储在数据库中,但是当我在这样的视图中显示它们时:而 只是 datetime 属性被转换为时区。
    【解决方案3】:

    我放弃了这一点,Rails 似乎完全忽略了带有时间属性的 config.time_zone,只是出于我不明白的原因将其用于日期时间属性。看起来,也没有多少人理解它。

    当我需要将它作为时间对象使用时,我会将时间属性更改为类型字符串并将其解析为时间对象。如果这在以后的 Rails 版本中得到修复,我总是可以改回使用时间属性,但现在我需要继续,这已经让我耽搁了好几天了。

    但感谢您的帮助:)

    【讨论】:

      猜你喜欢
      • 2014-03-16
      • 1970-01-01
      • 2019-01-24
      • 2018-08-30
      • 1970-01-01
      • 2018-10-17
      • 2011-09-23
      • 2021-02-11
      • 2018-07-23
      相关资源
      最近更新 更多