如何让Rails默认使用系统时间?

How do I make Rails use the system time by default?

我想配置我的 Rails 4.2.5 应用程序以使用其 运行 所在系统的时区(例如 Time.current 与 Time.now 相同),无需将其硬编码到配置中。

这是为了与在我受雇之前创建的现有遗留基础架构兼容。我完全了解默认使用 UTC 的最佳实践,并且有一天我们将重写所有代码以使用 UTC 作为默认设置,但今天这不是一个选项。由于现有代码和应用程​​序使用服务器的非 UTC 时区作为默认时区,违反该约定将破坏我们现有的代码。

这是一个专有应用程序,运行在使用 Chef 自动部署的云实例上;个别实例 手动管理。因此 OS 配置 应用程序环境配置并且在所有实例中都是一致的。此外,所有内容仅在 Linux 上运行,因此可移植性不是问题。

文档说如果设置了 Time.zone 或 config.time_zone,Time.current 将 return Time.now。我在 application.rb 中取消了 config.time_zone 设置,但默认情况下它仍然以某种方式设置为 "UTC"。我怎样才能防止这种情况发生,以便 Rails 只使用 OS 的时区设置?

我建议对 config.time_zone 使用 UTC 并根据登录用户的时区调整每个请求。

您可能对我在 rails 时区写的博客 post 感兴趣? http://jessehouse.com/blog/2013/11/15/working-with-timezones-and-ruby-on-rails/

如果你真的想将 config.time_zone 设置为不同的值应用范围 (不推荐) 你可以设置它到一个环境变量,并让您的厨师脚本在配置服务器期间设置该环境变量

config.time_zone = ENV['LOCAL_TIME_ZONE'] || 'UTC'`

无论你做什么:不要将 config.active_record.default_timezone 设置为 :local 这将导致以后出现严重问题

由于缺少适合我所需配置的本机 Rails 选项,我选择使用以下配置:

config.time_zone = File.read('/etc/timezone').strip

它并不漂亮,但由于我们的服务器配置受到严格控制,所以它现在可以使用。