Як змінити часовий пояс за замовчуванням для Active Record in 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 часу. Однак, коли записи створюються в БД, схоже, що datetimeвони зберігаються у форматі UTC.

У наведеному вище коментарі вони кажуть

... і зробити Active Record автоматичним перетворенням у цю зону ...

Як я можу це зробити, і де?

Крім того, я буду розгортати це на heroku також, і я хотів би, щоб налаштування перенести


У MySQL datetime - тип, який не обмежується часовим поясом. Тобто це може бути в будь-який часовий пояс. Якщо ви трактуєте це як UTC, це добре. Але будьте обережні, якщо хтось заглядає у вашу базу даних безпосередньо та інтерпретує її по-різному.
Вануан

Відповіді:


199

Я вирішив скласти цю відповідь, тому що всі інші здаються неповними.

config.active_record.default_timezone визначає, чи слід використовувати Time.local (якщо встановлено: local) або Time.utc (якщо встановлено значення: utc) під час витягування дат і часу з бази даних. За замовчуванням: utc. http://guides.rubyonrails.org/configuring.html


Якщо ви хочете змінити часовий пояс Rails , але продовжуйте зберігати Active Record в базі даних за UTC , використовуйте

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

Якщо ви хочете змінити часовий пояс Rails І мати час зберігання Active Record у цьому часовому поясі, використовуйте

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

Попередження : вам дійсно варто подумати двічі, навіть тричі, перш ніж зберігати час у базі даних у форматі, що не є UTC.

Примітка
Не забудьте перезапустити сервер Rails після зміни application.rb.


Пам'ятайте, що config.active_record.default_timezoneможе приймати лише два значення

  • : локальний (перетворюється на часовий пояс, визначений у config.time_zone)
  • : utc (перетворюється на UTC)

Ось як можна знайти всі доступні часові пояси

rake time:zones:all

5
Це здається найбільш повною / точною відповіддю - @Omnipresent
Aegix

2
Це має бути прийнятою відповіддю. Він більш повний.
Енріке Морено намет

@ Mihai-AndreiDinculescu Як ви вважаєте, що краще зберігати datetimeзначення в UTC в базі даних, а потім просто змінювати їх у прямому інтернеті, як на, moment.jsабо що ви пропонуєте, щоб показати ці дані у правильному часовому поясі для будь-якого користувача?
alexventuraio

@AlexVentura Так, люди розумніші за мене давно погодилися, що зберігання дат у UTC - найкращий шлях.
Михай-Андрій Дінкулеску

Так, я зрозумів Але що ви пропонуєте реалізувати у режимах перегляду рейок, щоб показати правильні значення для будь-якого користувача з різним часовим поясом?
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
Дуже дякую! Я також боровся з цим. У мене є спадковий застарілий додаток PHP, який взаємодіє з тією ж базою даних mysql і зберігає весь час, як локальний; оновлення його до використання UTC не було можливим. Я раніше нічого config.time_zone = 'Central Time (US & Canada)' config.active_record.default_timezone = 'Central Time (US & Canada)' не робив : але встановивши це на символ: місцевий, він зробив свою справу.
Метт Х'юк

8
Напрямні рейок кажуть, що config.active_record.default_timezoneслід встановлювати лише :localабо :utc. Я припускаю, що все інше мало б несподівані результати.
Келвін

2
Ви можете побачити всі часові зони, запустивши це вrake time:zones:all
Орландо,

34

Я дійшов такого ж висновку, що і Дін Перрі після сильних туг. config.time_zone = 'Adelaide'і config.active_record.default_timezone = :localбула виграшною комбінацією. Ось що я знайшов під час процесу.


5
Це правильна відповідь, default_timezone приймає лише: місцеві або: utc
Франческо Беладонна

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 перейдіть до конфігурації > 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 на 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 приймає один з двох варіантів ..: local або: utc .. він не приймає конкретний часовий пояс, тому це не буде працювати .. вам потрібно встановити default_timezone таким чином: local
Urkle
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.