Rails:将config.time_zone设置为服务器的时区?

时间:2016-02-02 20:43:31

标签: ruby-on-rails ruby date datetime

出于兼容性原因,我需要在服务器的本地时区存储和显示所有日期。为此,我在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?

3 个答案:

答案 0 :(得分:1)

Time.zone.tzinfo.identifier怎么样,对我来说是“America / New_York”。我在Postgres上使用它,但我怀疑它会给你你想要的字符串。

答案 1 :(得分:1)

只需输入“Bogota”作为config.time_zone的字符串,并将config.active_record.default_timezone设置为:local即可获得所需内容。 DB在当地时区(我希望是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

答案 2 :(得分:0)

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

我最终使用了以下内容:

config / environments / test.rb

...

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

...

这将获取服务器时区的偏移量(以整数小时表示),并根据该偏移量计算配置的时区。 此功能用途有限,因为每个偏移量有多个时区。但是,由于我只需要时间来进行测试,就足够了我的用例。

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