Ruby on rails 默认情况下,如何使Rails使用系统时间?

Ruby on rails 默认情况下,如何使Rails使用系统时间?,ruby-on-rails,timezone,Ruby On Rails,Timezone,我想将Rails 4.2.5应用程序配置为使用其运行系统的时区(例如time.current与time.now相同),而无需将其硬编码到配置中 这是为了与我受雇之前创建的现有遗留基础设施兼容。我完全了解默认情况下使用UTC的最佳实践,有一天我们将重写所有代码以使用UTC作为默认值,但这不是今天的选项。由于现有代码和应用程序使用服务器的非UTC时区作为默认时区,因此打破该约定将破坏我们现有的代码。 这是一个专有应用程序,运行在使用chef自动部署的云实例上;单个实例不是手动管理的。因此,OS配置是

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

这是为了与我受雇之前创建的现有遗留基础设施兼容。我完全了解默认情况下使用UTC的最佳实践,有一天我们将重写所有代码以使用UTC作为默认值,但这不是今天的选项。由于现有代码和应用程序使用服务器的非UTC时区作为默认时区,因此打破该约定将破坏我们现有的代码。

这是一个专有应用程序,运行在使用chef自动部署的云实例上;单个实例不是手动管理的。因此,OS配置是应用程序环境配置,在所有实例中都是一致的。而且,所有东西都只在Linux上运行,因此可移植性不是一个问题。


如果设置了Time.zone或config.Time\u zone,文档会说Time.current将返回Time.now。我在application.rb中未设置config.time_zone,但它在默认情况下仍然以某种方式设置为“UTC”。如何防止这种情况发生,使Rails只使用操作系统的时区设置?

我建议对
配置时区使用
UTC
,并根据登录用户的时区调整每个请求

你可能对我在rails时区上写的一篇博文感兴趣

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

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

无论您做什么:不要将
config.active\u record.default\u timezone
设置为
:local
,这将导致以后的主要问题由于我所需的配置没有本机Rails选项,我选择使用以下选项:

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

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

这是个坏主意。Web服务器永远不应该依赖于其服务器的时区设置。它太易碎了。如果Rails阻止了您这样做,那么这对Rails有好处!不要试图挫败这一最佳实践。我们使用chef部署自己的服务器,chef设置时区,我们的基础设施的多个组件使用时区,Rails应用程序只是其中的一小部分。我正在尝试使用干燥的最佳实践。否则,我们将面临各种应用程序具有不同默认时区的风险。危险是双重的。1) 管理员很容易不经意地更改系统时区,没有意识到它可能会影响什么;2)如果需要将应用程序从位置A移动到位置B,数据可能会变得不一致。最佳做法是不依赖系统时区,并且始终将系统时区设置为UTC,以避免您依赖有意义的本地时间,并避免夏令时异常。另请参见:。我甚至建议您也不要依赖Rail的默认时区设置。将其保留在UTC,并根据需要在应用程序逻辑中使用适当的时区转换(我同意house9回答的第一部分)。@MattJohnson我更新了问题,以解释为什么1)管理员不会更改系统时区,2)应用程序“位置”不会更改,3)使用UTC作为默认值不是一个选项。虽然这对从零开始的没有经验的开发人员来说是一个很好的建议,但我编辑了我的问题,以澄清为什么使用UTC的建议与我的情况无关。我认为使用
ENV
将是你最好的选择