Как изменить часовой пояс по умолчанию для Active Record в Rails?

141

В своем 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_zoneна время EST. Тем не менее, когда записи создаются в БД, похоже, что datetimeони хранятся в формате UTC.

В приведенном выше комментарии они говорят

... и сделаем автоматическое преобразование Active Record в эту зону ...

Как я могу это сделать и где?

Кроме того, я разверну это и на heroku, и я бы хотел, чтобы настройки были перенесены

Вездесущий
источник
В MySQL datetime - это тип без часового пояса. Т.е. это может быть в любом часовом поясе. Если вы относитесь к этому как к UTC, это нормально. Но будьте осторожны, если кто-то напрямую смотрит в вашу базу данных и интерпретирует ее по-другому.
Вануан

Ответы:

205

Я решил скомпилировать этот ответ, потому что все остальные кажутся неполными.

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может принимать только два значения

  • : local (преобразуется в часовой пояс, определенный в config.time_zone)
  • : utc (конвертирует в UTC)

Вот как вы можете найти все доступные часовые пояса

rake time:zones:all
Михай Динкулеску
источник
5
Это кажется наиболее полным / точным ответом - @Omnipresent
Aegix
2
Это должен быть принятый ответ. Это более полно.
Палатка Энрике Морено,
@ Mihai-AndreiDinculescu Считаете ли вы, что лучше сохранить datetimeзначения в формате UTC в базе данных, а затем просто изменить их во внешнем интерфейсе, например, с помощью moment.jsили что вы предлагаете, чтобы отображать эти данные в правильном часовом поясе для любого пользователя?
alexventuraio
@AlexVentura Да, люди умнее меня давным-давно согласились, что хранение дат в формате UTC - лучший способ.
Михай Динкулеску
Да, я получил его. Но что вы предлагаете реализовать в представлениях rails, чтобы отображать правильные значения для любого пользователя с другим часовым поясом?
alexventuraio
190

добавление следующих к 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)' но установка символа: local сделала свое дело.
Мэтт Хак,
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 принимает только: local или: utc
Франческо Белладонна
22

В моем случае (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, когда вы показываете значения даты и времени своим пользователям, конвертируйте их в их часовые пояса. Лучше сделать записи базы данных постоянными
Вахид
10

Если вы хотите установить глобальный часовой пояс на UTC, вы можете сделать следующее в Rails 4:

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

Обязательно перезапустите приложение, иначе вы не увидите изменений.

Sergserg
источник
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'
Сивэй Шэнь 申思维
источник
1

В Ruby on Rails 6.0.1 перейдите в config > locales > application.rb и согласитесь на 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

Вы можете видеть, что я настраиваю часовой пояс с помощью двух строк:

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 принимает один из двух вариантов ..: local или: utc .. он не принимает конкретный часовой пояс, поэтому это не сработает .. вам нужно установить default_timezone на: local
Urkle