У меня есть запрос на основе времени по рельсам, который имеет нечетное поведение, чувствительное к часовому поясу, хотя, насколько я знаю, я использую 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'
Системным часовым поясом (как сообщается в «дате») является BST (что означает GMT + 1), так что каким-то образом это рассматривается как UTC и прерывание запросов.
Это вызывает у меня всевозможные проблемы, так как мне нужно параметризовать запрос, передаваемый в разное время в действие (которые затем преобразуются с помощью Time.parse ()), и хотя я отправляю в UTC раз, это 'отключено к одному часу DST выпускают много урожаев. Даже использование '.gmtime ()' не всегда кажется, что это исправить.
Очевидно, что различие вызвано каким-то неявным преобразованием где-то, в результате чего BST неправильно трактуется как UTC, но почему? Разве рельсы не хранят метки времени в UTC? Разве часовой пояс класса Time не знает? Я использую Rails 2.2.2
Итак, что здесь происходит - и какой безопасный способ программирования вокруг него?
edit, некоторая дополнительная информация, чтобы показать, что делают 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