Приложение Rails не соответствует часовому поясу, настроенному в config / application.rb - PullRequest
1 голос
/ 10 апреля 2019

Я новичок в настройке часовых поясов и запутался в нескольких моментах. Будем благодарны за любые советы по правильной конфигурации.

Насколько я понимаю, рекомендуется хранить все метки времени в формате UTC в БД (я использую PostgreSQL). С другой стороны, в реальном приложении я хотел бы видеть метки времени в моем местном часовом поясе (JST +9: 00). Я настроил config/application.rb так:

module MyApp
  class Application < Rails::Application
    config.load_defaults 5.2
    config.time_zone = 'Tokyo'
  end
end

Однако я не уверен, что он настроен правильно, потому что я получаю смешанные результаты в rails console. Time.zone и Time.now говорят мне, что часовой пояс установлен на JST, но отметки времени created_at и updated_at отображаются как UTC, когда я User.first.

User.first
#=> #<User id: 1, first_name: "Bob", last_name: "Smith", created_at: "2019-04-09 08:54:30", updated_at: "2019-04-09 08:54:30"> 

Но тогда время отображается как JST, если я специально спрашиваю время created_at:

User.first.created_at
#=> Tue, 09 Apr 2019 17:54:30 JST +09:00

Почему метки времени отображаются как UTC, если я специально не спрашиваю о самом времени? Это нормально? То же самое происходит и для DateTime столбцов в других моих таблицах.

1 Ответ

1 голос
/ 10 апреля 2019

Все ваши даты кажутся одинаковыми, просто они представлены в разных контекстах.

Это:

User.first
#=> #<User id: 1, first_name: "Bob", last_name: "Smith", created_at: "2019-04-09 08:54:30", updated_at: "2019-04-09 08:54:30">

отображает результат .inspect

This:

User.first.created_at
#=> Tue, 09 Apr 2019 17:54:30 JST +09:00

- консоль, предполагающая, что вы хотите отформатировать дату в текущем часовом поясе.

Вы можете сделать некоторые представления явными

User.first.created_at.to_formatted_s(:db) #should print the same as you see on the inspect
I18n.localize(User.first.created_at) #should localize the date with the default date format
I18n.localize(USer.first.created_at, format: :something) #should localize the date as the format you defined as ":something" on your locale file
...