出于兼容性原因,我需要在服务器的本地时区存储和显示所有日期。为此,我在application.rb
:
# 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?
答案 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')
)中派生出来,那会更有帮助,但是我没有找到解决方案。