Почему этот запрос рельсов ведет себя по-разному в зависимости от часового пояса?

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

>> Model.find(:all,:conditions=>['created_at<=?',(Time.now-1.hours).gmtime]).length
=> 279
>> Model.find(:all,:conditions=>['created_at<=?',(Time.now-1.hours)]).length
=> 280

Где БД на самом деле содержит одну модель, созданную за последний час, и общее количество моделей составляет 280. Таким образом, только первый запрос является правильным.

Однако в environment.rb у меня есть:

config.time_zone = 'UTC'

Часовой пояс системы (как сообщается в «date») - это BST (то есть GMT + 1), так что каким-то образом это рассматривается как UTC и прерывание запросов.

Это вызывает у меня всевозможные проблемы, так как мне нужно параметризовать запрос, передаваемый в разное время в действие (которые затем преобразуются с помощью Time.parse ()), и хотя я отправляю время UTC, это 'отключается на единицу час & APOS; ДСТ выпускают посевы много. Даже используя «.gmtime ()» не всегда кажется, что это исправить.

Очевидно, что различие вызвано каким-то неявным преобразованием где-то, в результате чего BST неправильно трактуется как UTC, но почему? Разве рельсы не хранят метки времени в UTC? Не известно ли о часовом поясе класса Time? Я использую Rails 2.2.2

Итак, что здесь происходит - и какой безопасный способ программирования вокруг этого?

измените некоторую дополнительную информацию, чтобы показать, что делают DB и класс Time:

>> Model.find(:last).created_at
=> Tue, 11 Aug 2009 20:31:07 UTC +00:00
>> Time.now
=> Tue Aug 11 22:00:18 +0100 2009
>> Time.now.gmtime
=> Tue Aug 11 21:00:22 UTC 2009

Ответы на вопрос(3)

Ваш ответ на вопрос