Часовой пояс моего сервера - +0400 (Москва). Запись всех экземпляров в БД в формате UTC. IE: пользователь создает элемент на 04-00, это записывается как 00-00. Когда я пытаюсь получить
Item.last
Я вижу исходное время UTC. Когда я спрашиваю
Item.last.created_at
Я получаю +0400 время. НО! Когда я использую функции std time, такие как
Item.where('created_at > ?', Time.now.beginning_of_day)
он делает запрос sql
SELECT 'items'.* FROM 'items' WHERE (items.created_at > '2012-11-30 00:00:00')
вместо
SELECT 'items'.* FROM 'items' WHERE (items.created_at > '2012-11-29 20:00:00')
Поэтому я теряю 4 часа. Маленький хруст использует in_time_zone:
Time.now.beginning_of_day.in_time_zone(-4)
Но я не джедай: D Любые идеи?
Я думаю, я решил это:
Time.now.beginning_of_day.in_time_zone('UTC')
=> Thu, 29 Nov 2012 20:00:00 UTC +00:00
Так что это отношение, какое время в Москве, когда начинаются дни в часовом поясе UTC :)
Я надеюсь, что ваши пользователи имеют некоторые настройки, связанные с их часовыми поясами в своих профилях. В этом случае вы можете сделать следующее:
Time.use_zone(zone_of_current_user) do # like 'America/New_York'
@products = Product.where('created_at > ?', Time.zone.now.beginning_of_day)
end
Таким образом вы установите зону для блока.
Обратите внимание на использование zone
метода Time
.
use_zone
в around_filter
( ApplicationController
кажется хорошим местом для этого). Таким образом, любое ваше действие будет выполняться в часовом поясе пользователя.