Rails将config.active_record.default_timezone设置为:utc或:local以外的值

时间:2018-09-27 05:17:38

标签: ruby-on-rails postgresql rails-activerecord

我将我的应用程序时区设置为太平洋时间。

# application.rb: 
config.time_zone = 'Pacific Time (US & Canada)'  

我的生产服务器时间设置为太平洋时间。但是ActiveRecord将每个会话的postgres时区设置为'UTC':

[1] pry(main)> ActiveRecord::Base.connection.execute("show timezone").getvalue(0,0)
  (0.2ms)  show timezone
=> "UTC"  

docs说我对config.active_record.default_timezone仅有的两个选择是:utc:local

使用:local可以进行生产,但是我的开发服务器位于不同的时区。

我知道通常建议将所有时区设置保留为默认UTC,但是我的应用广泛使用Postgres的时间和日期功能进行ETL作业,复杂的数据分析查询等。我宁愿将postgres用作我的“单一来源”真相”而不是“ rails / ruby​​”,因此我对告诉我以UTC进行所有操作的答案不感兴趣

编辑:我确认正确设置了config.time_zone

[6] pry(main)> Rails.application.config.time_zone
=> "Pacific Time (US & Canada)"

并且config.active_record.default_timezone设置为:local

[9] pry(main)> Rails.application.config.active_record.default_timezone
=> :local

在同一次撬动会话中:

[10] pry(main)> ActiveRecord::Base.connection.execute("show timezone").getvalue(0,0)
   (0.2ms)  show timezone
=> "Asia/Bangkok"

1 个答案:

答案 0 :(得分:2)

在github上的PostgreSQLAdapter source上,我看到检查了变量哈希是否存在“时区”键。

$ ./rasterizerSimple gui

PostgreSQLAdapter docs表明 variables = @config.fetch(:variables, {}).stringify_keys # If using Active Record's time zone support configure the connection to return # TIMESTAMP WITH ZONE types in UTC. unless variables["timezone"] if ActiveRecord::Base.default_timezone == :utc variables["timezone"] = "UTC" elsif @local_tz variables["timezone"] = @local_tz end end :variables中的一个选项,因此我刚刚将config/database.yml添加到了database.yml。

variables: {timezone: 'US/Pacific'}

有点奇怪,您必须在这里而不是在# database.yml default: &default adapter: postgresql encoding: unicode pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> variables: {timezone: 'US/Pacific'} 中进行设置,但这确实可行。