Временные метки Rails не используют правильный часовой пояс

Я немного смущен о часовых поясах в рельсах. Я хочу, чтобы мое приложение rails использовало британское летнее время (например, летнее время в США) для временных меток, установленных в updated_at и created_at в моих моделях. Я изменил среду environment.rb, чтобы сказать

  config.time_zone = 'London'

Сервер ubuntu, на котором работает мое приложение, похоже, использует BST для его времени: в командной строке, например, если я набираю 'date', я получаю текущее время (не смещается на час). В консоли rails я вижу следующее:

>> time = Time.now
=> Wed Oct 27 16:29:17 +0100 2010
>> time.zone
=> "BST"

Все отлично. Однако, если я создаю новый объект модели AR и сохраняю его, отметки времени будут получены от часа назад. Таким образом, похоже, что это использует UTC. Теперь я вижу логику в этом: поскольку временные метки могут использоваться в логике модели, вы хотите, чтобы они основывались на неизменном временном интервале, то есть в UTC. Но это странный бит поведения, который я не понимаю:

#change a record and save it
>> someobj.save
=> true
#object updated_at is one hour ago
>> someobj.updated_at
=> Wed, 27 Oct 2010 15:34:22 UTC +00:00
>> Time.now
=> Wed Oct 27 16:34:31 +0100 2010
#however, Time.now - object updated at is just a few seconds.
>> Time.now - someobj.updated_at
=> 15.305549

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

Я хочу показать дату в текущем часовом поясе только для отчетов о состоянии и т.д. в представлениях: если кто-то обновляет что-то, я хочу, чтобы они увидели, что он был обновлен "1 минута назад" не "час назад",.

Может ли кто-нибудь развязать меня? приветствия, max

EDIT: моя непосредственная проблема, показывающая правильное время в статусе, решается с помощью помощника 'time_ago_in_words', который настраивается для часового пояса. Мне все равно хотелось бы, чтобы кто-нибудь объяснил, что происходит с метками времени:)

Ответ 1

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

Если вы хотите узнать, какая временная метка находится в вашем локальном часовом поясе, вам просто нужно спросить об этом так:

someobj.updated_at.localtime

Ответ 2

Обратите внимание на смещение, указанное в конце времени - первое смещение равно 0, второе - 1. Когда происходит расчет времени, смещение включается автоматически, так что вычитание дает правильный результат. someobj.updated_at и Time.now каждый отображает свое значение в другом часовом поясе, поэтому они на самом деле разделены на 9 секунд, а не 1 час и 9 секунд.