Rails에서 Active Record의 기본 시간대를 변경하는 방법은 무엇입니까?


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에서 작성 될 때 datetimeUTC 형식으로 저장되는 것처럼 보입니다 .

위의 의견에서 그들은 말합니다

... 그리고 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로 데이터베이스에 Active Record를 계속 저장하려면 다음을 사용하십시오.

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

당신이 변경하려는 경우 레일 시간대를 그리고 있는 액티브 레코드 이 시간대, 사용 저장 시간을

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

경고 : 비 UTC 형식으로 데이터베이스에 시간을 저장하기 전에 실제로 두 번, 심지어 세 번 생각해야합니다.

참고
수정 한 후에 Rails 서버를 다시 시작하는 것을 잊지 마십시오 application.rb.


config.active_record.default_timezone두 가지 값만 취할 수 있음을 기억하십시오

  • : local (에 정의 된 시간대로 변환 config.time_zone)
  • : utc (UTC로 변환)

사용 가능한 모든 시간대를 찾는 방법은 다음과 같습니다.

rake time:zones:all

5
이것은 가장 완전하고 정확한 답변 인 것 같습니다-@Omnipresent
Aegix

2
이것이 정답입니다. 더 완벽합니다.
Enrique Moreno Tent

미하이 - AndreiDinculescu 마 @ 당신은이 가게에 더 좋은 생각 datetime의 값 UTC를 데이터베이스에 다음 단지에 변경할 프론트 엔드 와 같은 moment.js또는 사용자에 대한 올바른 시간대에이 데이터를 보여주기 위해 무엇을 시사 하는가?
alexventuraio

@AlexVentura 예, UTC보다 날짜를 저장하는 것이 가장 좋은 방법이라고 오래 전에 동의 한 사람들입니다.
Mihai-Andrei Dinculescu

그래 알았어 그러나 시간대가 다른 모든 사용자에 대한 올바른 값을 표시하기 위해 레일보기에서 무엇을 구현하도록 제안합니까?
alexventuraio

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

8
레일 가이드는 또는 config.active_record.default_timezone로만 설정해야 한다고 말합니다 . 다른 것들은 예상치 못한 결과를 낳을 것이라고 생각합니다. :local:utc
Kelvin

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), 결국이 두 줄을 추가했습니다. app/config/environments/development.rb

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

그게 다야! 그리고 멜버른이 올바르게 읽히도록 터미널에서 명령을 실행했습니다.

bundle exec rake time:zones:all

멜버른은 내가 살고있는 시간대에 등록했습니다!


모든 사용자가 자신의 시간대에서 날짜-시간 값을 보도록하려면 어떻게해야합니까?
alexventuraio

@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

중국 사용자의 경우 아래 두 줄을 추가하십시오 config/application.rb.

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

0

Ruby on Rails 6.0.1에서 config > locales > application.rb로 가십시오.

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 두 가지 옵션 .. 중 하나 받아이없는 일이 ... 당신이 설정 default_timezone 필요 있도록 UTC ..이 특정 시간대를 허용하지 않습니다 : 지역
Urkle
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.