Raylarda Aktif Kayıt için varsayılan saat dilimi nasıl değiştirilir?


140

Benim application.rbaşağıdaki yorum geldi

# 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)'

Yukarıda gördüğünüz gibi, config.time_zoneEST zamanını yaptım . Bununla birlikte, kayıtlar DB'de oluşturulduğunda, görünüşe göre datetimeUTC formatında saklanıyor.

Yukarıdaki yorumda,

... ve Active Record'un bu bölgeye otomatik olarak dönüştürülmesini sağlayın ...

Bunu nasıl yapabilirim ve nerede?

Ayrıca, bunu heroku'ya da dağıtacağım ve ortamın devam etmesini istiyorum


MySQL'de datetime, saat dilimi gerektirmeyen bir türdür. Yani istediğiniz herhangi bir saat diliminde olabilir. Eğer UTC gibi davranırsanız sorun değil. Ancak birisinin veritabanınıza doğrudan bakıp bakmadığına dikkat edin ve farklı şekilde yorumlayın.
Vanuan

Yanıtlar:


199

Bu cevabı derlemeye karar verdim, çünkü diğerleri eksik görünüyor.

config.active_record.default_timezone , veritabanından tarih ve saat çekerken Time.local (yerel olarak ayarlanmışsa: yerel) veya Time.utc (ayarlıysa: utc) kullanılıp kullanılmayacağını belirler. Varsayılan değer: utc. http://guides.rubyonrails.org/configuring.html


Rails saat dilimini değiştirmek , ancak Active Record'un UTC'de veritabanına kaydetmesini sağlamak istiyorsanız , şunu kullanın:

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

Eğer değişim istiyorsanız Raylar dilimini VE var Active kayıt bu zaman dilimi, kullanımda mağaza kez

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

Uyarı : süreleri UTC olmayan bir biçimde kaydetmeden önce gerçekten iki kez, hatta üç kez düşünmelisiniz.

Not
Değiştirdikten sonra Rails sunucunuzu yeniden başlatmayı unutmayın application.rb.


config.active_record.default_timezoneBunun sadece iki değer alabileceğini unutmayın

  • : local (içinde tanımlanan saat dilimine dönüştürür config.time_zone)
  • : utc (UTC'ye dönüştürür)

Mevcut tüm zaman dilimlerini nasıl bulabileceğiniz aşağıda açıklanmıştır

rake time:zones:all

5
Bu en eksiksiz / doğru cevap gibi görünüyor - @Omnipresent
Aegix

2
Bu kabul edilen cevap olmalı. Daha eksiksiz.
Enrique Moreno Çadırı

Mihai- AndreiDinculescu Do @ bunu saklamak için daha iyi olduğunu düşünüyorum datetimedeğerleri UTC veritabanında ve sonra sadece bunları değiştirmek önyüzü olduğu gibi moment.jsya da herhangi bir kullanıcı için doğru zaman diliminde bu verileri göstermek için neler tavsiye edersiniz?
alexventuraio

@AlexVentura Evet, benden daha akıllı insanlar uzun zaman önce UTC'de tarih depolamanın en iyi yol olduğunu kabul ettiler.
Mihai-Andrei Dinculescu

Evet anladım. Ancak, farklı saat dilimlerine sahip herhangi bir kullanıcı için doğru değerleri göstermek üzere ray görünümlerinde ne uygulamanızı önerirsiniz?
alexventuraio

187

application.rbeserlere takip ekleme

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

59
Bu benim için çalışıyor:config.time_zone = 'London' config.active_record.default_timezone = :local
Dean Perry

41
Tüm Saat Dilimlerini bunu çalıştırarak görebilirsiniz rails c-ActiveSupport::TimeZone.all.map(&:name)
Dean Perry

5
Çok teşekkürler! Ben de bununla mücadele ediyordum. Ben aynı mysql veritabanı ile etkileşim ve her zaman yerel olarak depolar miras eski bir PHP uygulaması var; UTC'yi kullanmak için güncellemek bir seçenek değildi. Daha önce hiçbir şey başaramamıştım: config.time_zone = 'Central Time (US & Canada)' config.active_record.default_timezone = 'Central Time (US & Canada)' ama bunu yerel simgeye ayarlamak hile yaptı.
Matt Hucke

8
Ray kılavuzları bunun config.active_record.default_timezoneyalnızca :localveya olarak ayarlanması gerektiğini söylüyor :utc. Başka bir şeyin beklenmedik sonuçlara yol açacağını düşünüyorum.
Kelvin

2
Tüm Saat Dilimlerini bunu çalıştırarak görebilirsinizrake time:zones:all
Orlando

34

Çok üzüldükten sonra Dean Perry ile aynı sonuca vardım. config.time_zone = 'Adelaide've config.active_record.default_timezone = :localkazanan kombinasyon oldu. İşte bu süreçte bulduğum şey .


5
Bu doğru cevap, default_timezone sadece kabul ediyor: yerel veya: utc
Francesco Belladonna

20

Benim durumumda (Rails 5), bu 2 satırı app/config/environments/development.rb

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

Bu kadar! Ve Melbourne'un doğru okunduğundan emin olmak için, komutu terminalimde çalıştırdım:

bundle exec rake time:zones:all

ve Melbourne, bulunduğum saat diliminde listeliyordu!


Her kullanıcının kendi saat dilimlerinde tarih-saat değerlerini görmesini istersem ne olur?
alexventuraio

@AlexVentura, tarih-saat değerlerini kullanıcılarınıza gösterdiğinizde, bunları saat dilimlerine dönüştürün. Veritabanı kayıtlarının kalıcı hale getirilmesi daha iyi bir uygulamadır
Waheed

10

Saat dilimini global olarak UTC'ye ayarlamak istiyorsanız, Rails 4'te aşağıdakileri yapabilirsiniz:

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

Uygulamanızı yeniden başlattığınızdan emin olun, aksi takdirde değişiklikleri görmezsiniz.


3

4.2.2 raylarında şu adrese gidin application.rbve kullanın config.time_zone='city'(örneğin: 'Londra' veya 'Bükreş' veya 'Amsterdam' vb.).

Sadece iyi çalışmalı. Benim için çalıştı.


3

Bu bloğu dosyama eklemek zorunda kaldım environment.rbve her şey yolundaydı :)

Rails.application.configure do
    config.time_zone = "Pacific Time (US & Canada)"
    config.active_record.default_timezone = :local
end
  • Bunu katma önce hatRails.application.initialize!

1

Çinli kullanıcılar için, size iki satır ekleyin config/application.rb:

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

0

Ruby on Rails 6.0.1'de config > locales > application.rb y agrega lo siguiente adresine gidin :

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

Saat dilimini 2 satırla yapılandırdığımı görebilirsiniz:

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

Umarım Ruby on Rails 6.0.1 ile çalışanlara yardımcı olur


-2

Yerel saatin ayarlanmasını istiyorsanız, aşağıdaki metni 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

Ardından sunucunuzu yeniden başlatın


12
default_timezone iki seçenekten birini kabul eder ..: local veya: utc .. belirli bir saat dilimini kabul etmez, bu nedenle çalışmaz .. default_timezone değerini şu şekilde ayarlamanız gerekir: local
Urkle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.