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

Rails: Set config.time_zone to the server's time zone?

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

1
2
# 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设置为服务器的本地时区并尝试使用:

1
config.time_zone = Time.now.zone

但它的问题是它返回一个三字符时区代码,如COT和config.time_zone期望时区名称像Bogota

如何将三个字符代码翻译为全时区名称?或者,我如何获得本地时区名称?或者,如何配置Rails以不将数据库日期转换为UTC?


只需输入"Bogota"作为config.time_zone的字符串,并将config.active_record.default_timezone设置为:local即可获得所需内容。当地时区的DB(我希望是Bogata的TZ)和Bogata的TZ中的模型属性也是如此。

更新

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

所以@Sergio,好消息是您可以将config.time_zone设置为您在使用Ubuntu工具时熟悉的IANA时区名称,即。你可以做:

1
config.time_zone ="America/Bogota"

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

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


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


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

我最终使用了以下内容:

配置/环境/ test.rb

1
2
3
4
5
...

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

...

这会将服务器时区的偏移量作为整数小时数进行抓取,并根据该时区计算配置的时区。这有用性有限,因为每个偏移有多个时区。但由于我只需要匹配测试的时间,这对我的用例来说已经足够了。

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