2017-06-08 10 views
1

Ruby 2.4.1で動作するRails 5.0.2 API専用アプリケーション。 configにRails 5 API:config.time_zoneをUTCにグローバルに設定する

  1. 設定TIME_ZONEへ
  2. 設定のActiveRecord DEFAULT_TIMEZONEに "UTC":UTC
  3. アプリケーションの設定変更後に複数回再起動

application.rb

config.time_zone = "UTC" 
config.active_record.default_timezone = :utc 

モデルクエリ

あなたが見ることができるように3210
weight_entry = @current_user.weight_entries 
          .where(taken_on: Time.now.beginning_of_day..Time.now.end_of_day) 
          .first 

は、次のクエリ

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]] 

を実行し、グローバルUTCを設定するにもかかわらず、データベースに対してActiveRecordのクエリはまだ時間コンポーネントにオフセット(6時間)を使用している:

["taken_on", 2017-06-07 06:00:00 UTC], 
["taken_on", 2017-06-08 05:59:59 UTC], ["LIMIT", 1]] 

私は、タイムスタンプがより次のようになりますことを、UTCは、アプリケーション全体のデフォルトであることを、期待:

["taken_on", 2017-06-07 00:00:00 UTC], 
["taken_on", 2017-06-08 23:59:59 UTC], ["LIMIT", 1]] 

私が(手動挿入UTC)これまでのモデルのクエリに変更した場合:

["taken_on", 2017-06-07 00:00:00 UTC], 
["taken_on", 2017-06-08 23:59:59 UTC], ["LIMIT", 1]] 

は、私は本当に私が時間を使用するたびに.utc挿入する必要があります:

weight_entry = @current_user.weight_entries 
         .where(taken_on: Time.now.utc.beginning_of_day..Time.now.utc.end_of_day) 
         .first 

を私は期待どおりの結果を得ます私はUTCをデフォルトのタイムゾーンとして設定していますが、

私はここで何が欠けていますか?

答えて

3
+0

優れたレスポンスの代わりにTime.zone.nowを使用する必要があります。私は本当にそれを感謝します。あなたが提供した2番目の参考資料、「網全体のタイムゾーンへの完全なガイド」は、まさに私が必要とした教育です。再度、感謝します! – Schleichermann

関連する問題