Bagaimana cara mengubah zona waktu default untuk Rekaman Aktif di Rails?

140

Dalam buku saya, application.rbsaya menemukan komentar berikut

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

Seperti yang Anda lihat dari atas, saya membuat config.time_zonewaktu EST. Namun, masih ketika catatan dibuat dalam DB, sepertinya datetimedisimpan dalam format UTC.

Dalam komentar di atas, kata mereka

... dan buat Rekaman Aktif otomatis dikonversi ke zona ini ...

Bagaimana saya bisa melakukan itu, dan di mana?

Juga, saya akan menyebarkan ini pada heroku juga dan saya ingin pengaturan untuk melanjutkan

Di mana-mana
sumber
Dalam datetime MySQL adalah jenis zona waktu-kurang. Yaitu bisa di zona waktu yang Anda inginkan. Jika Anda memperlakukannya sebagai UTC itu tidak masalah. Tetapi waspadalah jika seseorang melihat ke dalam database Anda secara langsung dan menafsirkannya secara berbeda.
Vanuan

Jawaban:

199

Saya telah memutuskan untuk menyusun jawaban ini karena semua yang lain tampaknya tidak lengkap.

config.active_record.default_timezone menentukan apakah akan menggunakan Time.local (jika diatur ke: lokal) atau Time.utc (jika diatur ke: utc) saat menarik tanggal dan waktu dari database. Standarnya adalah: utc. http://guides.rubyonrails.org/configuring.html


Jika Anda ingin mengubah zona waktu Rails , tetapi terus menyimpan Rekaman Aktif dalam database dalam UTC , gunakan

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

Jika Anda ingin mengubah zona waktu Rails dan memiliki waktu penyimpanan Rekaman Aktif di zona waktu ini, gunakan

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

Peringatan : Anda benar-benar harus berpikir dua kali, bahkan tiga kali, sebelum menghemat waktu dalam database dalam format non-UTC.

Catatan
Jangan lupa untuk me-restart server Rails Anda setelah memodifikasi application.rb.


Ingatlah bahwa config.active_record.default_timezonehanya dapat mengambil dua nilai

  • : local (dikonversi ke zona waktu yang ditentukan dalam config.time_zone)
  • : utc (dikonversi ke UTC)

Inilah cara Anda dapat menemukan semua zona waktu yang tersedia

rake time:zones:all
Mihai-Andrei Dinculescu
sumber
5
Ini sepertinya jawaban yang paling lengkap / akurat - @ Hadir
Aegix
2
Ini harus menjadi jawaban yang diterima. Itu lebih lengkap.
Enrique Moreno Tent
@ Mihai-AndreiDinculescu Apakah menurut Anda lebih baik menyimpan datetimenilai dalam UTC dalam database dan kemudian mengubahnya di frontend seperti moment.jsatau dengan apa yang Anda sarankan untuk menampilkan data ini di zona waktu yang benar untuk setiap pengguna?
alexventuraio
@AlexVentura Ya, orang-orang yang lebih pintar dari saya sepakat sejak lama bahwa menyimpan tanggal di UTC adalah cara terbaik untuk pergi.
Mihai-Andrei Dinculescu
Ya saya mengerti. Tapi apa yang Anda sarankan untuk diterapkan dalam tampilan rel untuk menunjukkan nilai yang benar untuk setiap pengguna dengan zona waktu berbeda?
alexventuraio
187

menambahkan berikut ke application.rbkarya

 config.time_zone = 'Eastern Time (US & Canada)'
 config.active_record.default_timezone = :local # Or :utc
Di mana-mana
sumber
59
Ini bekerja untuk saya dengan ini:config.time_zone = 'London' config.active_record.default_timezone = :local
Dean Perry
41
Anda dapat melihat semua Zona Waktu dengan menjalankan ini di rails c-ActiveSupport::TimeZone.all.map(&:name)
Dean Perry
5
Terima kasih banyak! Saya telah berjuang dengan ini juga. Saya memiliki aplikasi warisan PHP warisan yang berinteraksi dengan database mysql yang sama dan menyimpan semua waktu sebagai lokal; memperbaruinya untuk menggunakan UTC bukanlah suatu pilihan. Apa yang sebelumnya tidak saya capai: config.time_zone = 'Central Time (US & Canada)' config.active_record.default_timezone = 'Central Time (US & Canada)' tetapi mengaturnya ke: simbol lokal melakukan trik.
Matt Hucke
8
Panduan rel mengatakan bahwa config.active_record.default_timezoneseharusnya hanya disetel ke :localatau :utc. Saya berasumsi bahwa hal lain akan memiliki hasil yang tidak terduga.
Kelvin
2
Anda dapat melihat semua Zona Waktu dengan menjalankan ini dirake time:zones:all
Orlando
34

Saya sampai pada kesimpulan yang sama dengan Dean Perry setelah banyak kesedihan. config.time_zone = 'Adelaide'dan config.active_record.default_timezone = :localmerupakan kombinasi pemenang. Inilah yang saya temukan selama proses.

James Barona
sumber
5
Ini adalah jawaban yang tepat, default_timezone hanya menerima: lokal atau: utc
Francesco Belladonna
20

Dalam kasus saya (Rails 5), saya akhirnya menambahkan 2 baris ini di app/config/environments/development.rb

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

Itu dia! Dan untuk memastikan bahwa Melbourne dibaca dengan benar, saya menjalankan perintah di terminal saya:

bundle exec rake time:zones:all

dan Melbourne terdaftar di zona waktu tempat saya berada!

Carole
sumber
Bagaimana jika saya ingin setiap pengguna melihat nilai waktu-waktu di zona waktu mereka sendiri?
alexventuraio
@AlexVentura ketika Anda menunjukkan nilai waktu-tanggal untuk pengguna Anda, ubah ke zona waktu mereka. Membuat catatan basis data tetap ada adalah praktik yang lebih baik
Waheed
10

Jika Anda ingin mengatur zona waktu ke UTC secara global, Anda dapat melakukan hal berikut di Rails 4:

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

Pastikan untuk memulai kembali aplikasi Anda atau Anda tidak akan melihat perubahannya.

sergserg
sumber
3

Pada kereta 4.2.2, pergi application.rbdan gunakan config.time_zone='city'(misalnya: 'London' atau 'Bucharest' atau 'Amsterdam' dan sebagainya).

Seharusnya itu berjalan baik baik saja. Ini berhasil untuk saya.

Andrei Laslo
sumber
3

Saya harus menambahkan blok ini ke environment.rbfile saya dan semuanya baik-baik saja :)

Rails.application.configure do
    config.time_zone = "Pacific Time (US & Canada)"
    config.active_record.default_timezone = :local
end
  • Saya menambahkannya sebelum barisRails.application.initialize!
Taylor A. Leach
sumber
1

untuk pengguna China, cukup tambahkan dua baris di bawah ini untuk Anda config/application.rb:

config.active_record.default_timezone = :local
config.time_zone = 'Beijing'
Siwei Shen 申思维
sumber
0

Di Ruby on Rails 6.0.1 buka 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

Anda dapat melihat bahwa saya mengonfigurasi zona waktu dengan 2 baris:

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

Saya harap ini membantu mereka yang bekerja dengan Ruby on Rails 6.0.1

Juan Castro Lurita
sumber
-2

Jika Anda ingin waktu lokal diatur, tambahkan teks berikut ini di 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

Kemudian restart server Anda

Anand
sumber
12
default_timezone menerima salah satu dari dua opsi ..: lokal atau: utc .. tidak menerima zona waktu tertentu, jadi ini tidak akan berfungsi .. Anda perlu mengatur default_timezone ke: local
Urkle