Railsのアクティブレコードのデフォルトのタイムゾーンを変更するにはどうすればよいですか?


140

私の中でapplication.rb私は次のコメントに出くわしました

# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
 config.time_zone = 'Eastern Time (US & Canada)'

上からわかるように、config.time_zoneESTの時間に合わせました。ただし、DBでレコードが作成datetimeされると、UTC形式で格納されているように見えます。

上記のコメントで、彼らは言う

...そして、Active Recordをこのゾーンに自動変換します...

どうすればそれを行うことができますか?

また、これをherokuにも展開していきますので、引き継ぐ設定をお願いします


MySQLでは、datetimeはタイムゾーンのない型です。つまり、どのタイムゾーンでもかまいません。UTCとして扱う場合は問題ありません。ただし、誰かがデータベースを直接調べて別の解釈をしている場合は注意してください。
Vanuan

回答:


199

他のすべてが不完全であるように見えるので、私はこの答えをまとめることに決めました。

config.active_record.default_timezoneは、データベースから日付と時刻を取得するときに、Time.local(:localに設定されている場合)またはTime.utc(:utcに設定されている場合)のどちらを使用するかを決定します。デフォルトは:utcです。 http://guides.rubyonrails.org/configuring.html


Railsのタイムゾーンを変更したいが、アクティブレコードUTCのデータベースに保存し続ける場合は、

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

あなたが変更したい場合はRailsのタイムゾーンをAND持つアクティブレコードのこの時間帯に店の時間を、使用

# application.rb
config.time_zone = 'Eastern Time (US & Canada)'
config.active_record.default_timezone = :local

警告:非UTC形式でデータベースに時間を保存する前に、2回、3回も考える必要があります。


変更後は、必ずRailsサーバーを再起動してくださいapplication.rb


config.active_record.default_timezone2つの値しか取ることができないことを覚えておいてください

  • :local(で定義されたタイムゾーンに変換config.time_zone
  • :utc(UTCに変換)

利用可能なすべてのタイムゾーンを見つける方法は次のとおりです

rake time:zones:all

5
これは最も完全で正確な答えのようです-@Omnipresent
Aegix

2
これは受け入れられる答えになるはずです。より完全です。
エンリケモレノテント

@ Mihai-AndreiDinculescu データベースのUTCdatetime値を保存してから、フロントエンドで値を変更したり、ユーザーの正しいタイムゾーンでこのデータを表示するために何を提案したりするのが良いと思いますか?moment.js
alexventuraio 2016

@AlexVenturaはい、日付をUTCに保存するのが最善の方法であると私がずっと前に同意した私より賢い人たち。
Mihai-Andrei Dinculescu

うん、わかった。しかし、異なるタイムゾーンを持つ任意のユーザーの正しい値を表示するために、railsビューに何を実装することをお勧めしますか?
alexventuraio 2016

187

application.rb作品にフォローを追加する

 config.time_zone = 'Eastern Time (US & Canada)'
 config.active_record.default_timezone = :local # Or :utc

59
それは私のためにこれで働いています:config.time_zone = 'London' config.active_record.default_timezone = :local
ディーンペリー

41
あなたには、これを実行して、すべてのタイムゾーンを見ることができますrails c-ActiveSupport::TimeZone.all.map(&:name)
ディーン・ペリー

5
本当にありがとう!私もこれに苦労していました。同じmysqlデータベースと対話し、常にローカルとして保存する継承されたレガシーPHPアプリがあります。UTCを使用するように更新することはできませんでした。以前は何も達成していませんでしたconfig.time_zone = 'Central Time (US & Canada)' config.active_record.default_timezone = 'Central Time (US & Canada)' が、:localシンボルに設定するとうまくいきました 。
Matt Hucke、2012

8
レールガイドは、またはにconfig.active_record.default_timezoneのみ設定する必要があると述べています。それ以外は予期しない結果になると思います。:local:utc
ケルビン

2
これを実行すると、すべてのタイムゾーンを確認できますrake time:zones:all
Orlando

34

私は多くの苦痛の後、ディーン・ペリーと同じ結論に達しました。 config.time_zone = 'Adelaide'そしてconfig.active_record.default_timezone = :local勝利の組み合わせでした。ここに私がプロセス中に見つけたものがあります。


5
これが正しい答えです。default_timezoneは:localまたは:utcのみを受け入れます
Francesco Belladonna

20

私の場合(Rails 5)、私は私の2行を追加しました app/config/environments/development.rb

config.time_zone = "Melbourne"
config.active_record.default_timezone = :local

それでおしまい!そして、メルボルンが正しく読み取られたことを確認するために、ターミナルでコマンドを実行しました。

bundle exec rake time:zones:all

メルボルンは私がいるタイムゾーンでリストアップされていました!


すべてのユーザーが自分のタイムゾーンで日時の値を表示する場合
alexventuraio 2016

@AlexVenturaは、日時の値をユーザーに表示するときに、タイムゾーンに変換します。データベースレコードを永続化することをお
Waheed

10

タイムゾーンをグローバルにUTCに設定する場合は、Rails 4で次のようにできます。

# Inside config/application.rb
config.time_zone = "UTC"
config.active_record.default_timezone = :utc

必ずアプリケーションを再起動してください。再起動しないと、変更が表示されません。


3

レール4.2.2に移動しapplication.rbて使用しますconfig.time_zone='city'(例:「ロンドン」、「ブカレスト」、「アムステルダム」など)。

正常に動作するはずです。それは私のために働いた。


3

このブロックをenvironment.rbファイルに追加する必要があり、すべて順調でした:)

Rails.application.configure do
    config.time_zone = "Pacific Time (US & Canada)"
    config.active_record.default_timezone = :local
end
  • 行のに追加しましたRails.application.initialize!

1

中国のユーザーの場合は、下に2行追加するだけですconfig/application.rb

config.active_record.default_timezone = :local
config.time_zone = 'Beijing'

0

Ruby on Rails 6.0.1では、config > locales > application.rb y agrega lo siguienteに移動します。

require_relative 'boot'

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module CrudRubyOnRails6
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0

    config.active_record.default_timezone = :local
    config.time_zone = 'Lima'

    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration can go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded after loading
    # the framework and any gems in your application.
  end
end

タイムゾーンを2行で構成していることがわかります。

config.active_record.default_timezone =: local
config.time_zone = 'Lima'

Ruby on Rails 6.0.1を使用している人の役に立つことを願っています


-2

現地時間を設定する場合は、次のテキストを application.rb

config.time_zone = 'Chennai'

# WARNING: This changes the way times are stored in the database (not recommended)
config.active_record.default_timezone = :local

次に、サーバーを再起動します


12
DEFAULT_TIMEZONEは... 2つのオプションのいずれかを受け入れる:ローカルまたは:UTCこれは動作しません..だからそれは、特定の時間帯を受け入れない..あなたがセットDEFAULT_TIMEZONEにする必要がありますローカル
Urkle
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.