【问题标题】:Rails 3.2 + Ruby 1.9.3, created_at returns with wrong timezoneRails 3.2 + Ruby 1.9.3,created_at 返回时区错误
【发布时间】:2013-03-13 16:40:03
【问题描述】:

我升级到 Rails 3.2 和 Ruby 1.9.3,我得到一个非常奇怪的行为

我有一个名为 Entry 的模型。当创建一个新条目时,它会以当前日期和时间插入到数据库中。

但是当我运行Entry.find_by_id(THE_ENTRY_ID).created_at 时,我得到了在日期时间创建的“正确”,但在不同的时区中,例如: 在数据库中:

2013-03-24 00:05:29

在 Rails 控制台和应用程序中:

2013 年 3 月 23 日星期六 20:05:29 EDT -04:00

为什么突然返回错误的时区?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord timezone


    【解决方案1】:

    检查application.rb中的配置。如果未设置时区,rails 将采用操作系统的默认时区。要解决此问题,请将 UTC 设置为时区。

    【讨论】:

    • 在我的 application.rb 中我有:config.time_zone = 'Eastern Time (US & Canada)' 我添加了:config.active_record.default_timezone = 'Eastern Time (US & Canada)' 但我仍然有同样的问题......似乎当它被保存时,它是我的时区(+2),当我获取它时,它是 -4
    • 您是否尝试过您视图中的localization helper?不确定它是否在 Rails 控制台中可用,但它别名为 I18n#l,或者在您的视图中只是 l。也就是说,我不知道为什么在获取时它会是-4。
    【解决方案2】:

    阅读 DOCS 并看到此 rails casts 后确定: http://railscasts.com/episodes/106-time-zones-revised

    现在一切都清楚了。

    config.time_zone = 'Eastern Time (US & Canada)'
    

    此设置是负责将所有时间对象转换为当前时区的实际设置。这就是我认为它是-4的方式

    这个设置:

    config.active_record.default_timezone
    

    是决定如何在数据库中保存时间的那个,但是...它只获得 2 个可能的值::local 和 :UTC,默认值为 :UTC

    当我使用 rails 控制台查看我的条目时,显示的时间是在转换为 'Eastern Time' 之后,以便查看存储在数据库中的实际日期使用:

    created_at_before_type_cast
    

    它返回 UTC 时间,因为它是默认的

    以及我认为在数据库中存储在我的时区 +2 中的原因 是因为我使用了 MySQL Workbench,它的 GUI 只是向我显示了本地机器时间中的日期时间值。

    总结:

    真正重要的设置:

    config.time_zone
    

    它工作得很好。 通过 DOCS 很重要

    【讨论】:

      猜你喜欢
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      相关资源
      最近更新 更多