Rails 5 API:将config.time_zone全局设置为UTC

Sch*_*ann 2 ruby timezone activerecord datetime ruby-on-rails

仅在Rails 2.4.1上运行的Rails 5.0.2 API应用程序。

  1. 将配置中的time_zone设置为“ UTC”
  2. 将ActiveRecord default_timezone设置为:utc
  3. 更改配置后,应用程序多次重新启动

application.rb

config.time_zone = "UTC"
config.active_record.default_timezone = :utc
Run Code Online (Sandbox Code Playgroud)

模型查询

weight_entry = @current_user.weight_entries
                            .where(taken_on: Time.now.beginning_of_day..Time.now.end_of_day)
                            .first
Run Code Online (Sandbox Code Playgroud)

执行以下查询

WeightEntry Load (3.2ms)  SELECT  "weight_entries".* 
FROM "weight_entries" WHERE "weight_entries"."user_id" = $1 
AND ("weight_entries"."taken_on" BETWEEN $2 AND $3) 
ORDER BY "weight_entries"."id" 
ASC LIMIT $4  [["user_id", 3], 
["taken_on", 2017-06-07 06:00:00 UTC], 
["taken_on", 2017-06-08 05:59:59 UTC], ["LIMIT", 1]]
Run Code Online (Sandbox Code Playgroud)

如您所见,尽管全局设置了UTC,但针对数据库的ActiveRecord查询在时间部分仍使用偏移量(6小时):

["taken_on", 2017-06-07 06:00:00 UTC], 
["taken_on", 2017-06-08 05:59:59 UTC], ["LIMIT", 1]]
Run Code Online (Sandbox Code Playgroud)

我希望UTC是应用程序中的默认值,时间戳看起来会更像这样:

["taken_on", 2017-06-07 00:00:00 UTC], 
["taken_on", 2017-06-08 23:59:59 UTC], ["LIMIT", 1]]
Run Code Online (Sandbox Code Playgroud)

如果我将模型查询更改为此(手动插入utc):

weight_entry = @current_user.weight_entries
                        .where(taken_on: Time.now.utc.beginning_of_day..Time.now.utc.end_of_day)
                        .first
Run Code Online (Sandbox Code Playgroud)

我得到了预期的结果:

["taken_on", 2017-06-07 00:00:00 UTC], 
["taken_on", 2017-06-08 23:59:59 UTC], ["LIMIT", 1]]
Run Code Online (Sandbox Code Playgroud)

即使我已将UTC设置为默认时区,在通过Rails插入和查询数据库时,是否真的需要在每次使用时间元素时都插入.utc吗?

我在这里想念什么?