Поле ActiveRecord DateTime не соответствует объекту - PullRequest
0 голосов
/ 05 января 2012

У меня есть модель курса, которая имеет атрибут datetime.Если я смотрю на это из базы данных, я получаю один раз, а если я смотрю на это с объекта, я получаю другую дату и время.

>> Course.last.attribute_for_inspect :datetime
=> "\"2012-01-04 01:00:00\""
>> Course.last.datetime
=> Tue, 03 Jan 2012 19:00:00 CST -06:00

Кто-нибудь знает, почему это значение отличается, и что я могу сделать, чтобы это исправить?Время из Course.last.datetime правильное, но мои запросы к таблице курсов работают неправильно из-за путаницы.

Ответы [ 2 ]

2 голосов
/ 05 января 2012

Из тонкой инструкции :

attribute_for_inspect (attr_name)
Возвращает #inspect -подобную строку для значения атрибута attr_name.
[...]
Атрибуты даты и времени возвращаются в формате :db.

Таким образом, когда attribute_for_inspect используется для даты и времени, он вернет строку, которую база данных использует для этого значения. Rails хранит время в базе данных в формате UTC, и любая разумная база данных будет использовать ISO 8601 для форматирования временных отметок при входе и выходе.

2012-01-04 01:00:00 - это отметка времени UTC в формате ISO 8601. Когда Rails возвращает дату и время, он преобразует его в экземпляр ActiveSupport::TimeWithZone и включает в себя настройку часового пояса на основе часового пояса, который вы настроили в application.rb. Вы используете часовой пояс CST, и это на шесть часов меньше UTC; вычитание шести часов с 01:00 дает 19:00, и вы теряете день от перехода в полночь. Удобный для человека формат Tue, 03 Jan 2012 19:00:00 CST -06:00 - это то, как ActiveSupport :: TimeWithZone представляет себя, когда inspect ed, а консоль использует x.inspect для отображения x.

Что касается исправления ваших запросов, просто используйте t.utc перед отправкой за t, и все будет хорошо.

0 голосов
/ 25 сентября 2017

Настройка часового пояса приложения Rails в application.rb

установите для config.active_record.default_timezone значение: local, как установлено в: utc по умолчанию в application.rb

вставьте этот код в ваше приложение. Rb

config.active_record.default_timezone = :local #or :utc
config.time_zone = "Singapore" #your timezone
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...