【问题标题】:Rails: Set config.time_zone to the server's time zone?Rails:将 config.time_zone 设置为服务器的时区?
【发布时间】:2016-02-02 20:43:31
【问题描述】:

出于兼容性原因,我需要在服务器的本地时区中存储和显示所有日期。为此,我在application.rb 中配置了这样的rails 应用程序:

# Do not convert database DATETIME / DATE columns to UTC:
config.active_record.default_timezone = :local

当我存储它们存储在服务器本地时区中的日期时,它可以正常工作。但是在检索数据时,Rails 会将其转换为 UTC,例如 Post.find(1).posted 返回 2016-02-02 18:06:48 UTC 但它实际上在数据库中存储为 2016-02-02 13:06:48

如何防止 Rails 将其转换为 UTC?

我认为将应用程序时区设置为服务器的本地时区会有所帮助,所以我想将config.time_zone 设置为服务器的本地时区并尝试:

config.time_zone = Time.now.zone

但它的问题是它返回一个三字符的时区代码,如 COT,而 config.time_zone 需要一个时区名称,如 Bogota

如何将三个字符代码转换为完整的时区名称?或者,如何获取本地时区名称?或者,如何将 Rails 配置为不将数据库日期转换为 UTC?

【问题讨论】:

    标签: ruby-on-rails ruby date datetime


    【解决方案1】:

    只需输入“Bogota”作为config.time_zone 的字符串并将config.active_record.default_timezone 设置为:local,您应该会得到所需的内容。本地时区的数据库(我希望是 Bogata 的 TZ)和 Bogata 的 TZ 中的模型属性。

    更新

    根据评论,OP 希望能够在操作系统级别设置 Ubuntu 中的时区,然后使用该设置来配置 Rails,而无需任何额外步骤。

    所以@Sergio,好消息是您可以config.time_zone 设置为the IANA timezone name,这是您在使用Ubuntu 工具时所熟悉的,即。你可以做到:

    config.time_zone = "America/Bogota"
    

    所以你需要做的就是弄清楚如何从你的操作系统中获取它,我认为它应该是 /etc/timezone 的内容所以:

    config.time_zone = File.read("/etc/timezone").chomp
    

    【讨论】:

    • 感谢您的回答。这就是我现在所拥有的,但是我希望 rails 采用运行应用程序的服务器的时区,而不是固定时区。
    • 服务器不知道它的位置,你必须自己设置 config.time_zone 设置(这就是为什么 Rails 不只是为你做这件事)。
    • 确实,服务器不知道它的位置,但如果您有 root 访问权限,您实际上可以为您的服务器配置一个时区,例如在 ubuntu 中,您可以执行 dpkg-reconfigure tzdata 并选择一个时区。这是我感兴趣的时区。但是,如果没有办法让铁轨抓住它,我想我只能坚持使用固定的。也许我可以把时区放在 ENV 中。
    • 太棒了。正是我想要的。
    【解决方案2】:

    Time.zone.tzinfo.identifier 呢,对我来说那是“美国/纽约”。我在 Postgres 上使用它,但我怀疑这会给你你期望的字符串。

    【讨论】:

    • 不能在application.rb中使用:未定义方法`tzinfo' for nil:NilClass (NoMethodError)
    【解决方案3】:

    我需要做一些类似的测试。我们的一些测试依赖于浏览器日历中选择的日期,但由于时区设置,在深夜服务器浏览器和 Rails 后端在不同的日期。

    我最终使用了以下内容:

    config/environments/test.rb

    ...
    
    config.time_zone = ActiveSupport::TimeZone[Time.now.strftime('%z').gsub('0', '').to_i]
    
    ...
    

    这会以整数小时数获取服务器时区的偏移量,并以此为基础计算配置的时区。 这用处有限,因为每个偏移量有多个时区。但由于我只需要匹配测试的时间,这对于我的用例来说已经足够了。

    如果时区可以从服务器时区短代码(Time.now.strftime('%Z'))派生出来会更有帮助,但我没有找到解决方案。

    【讨论】:

    • config.time_zone from application.rb 无法读取时区代码:/
    猜你喜欢
    • 2014-10-07
    • 1970-01-01
    • 2014-10-03
    • 2023-03-24
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多