Смещение времени в рельсах

0

Часовой пояс моего сервера - +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 Любые идеи?

  • 0
    Из интереса, как ты "записываешь в БД в формате UTC"? Это обрабатывается автоматически, или вы должны сделать это явно?
  • 1
    @JonSkeet Rails (фактически его компонент ActiveRecord) обрабатывает это автоматически.
Показать ещё 2 комментария

2 ответа

0
Лучший ответ

Я думаю, я решил это:

Time.now.beginning_of_day.in_time_zone('UTC')
 => Thu, 29 Nov 2012 20:00:00 UTC +00:00 

Так что это отношение, какое время в Москве, когда начинаются дни в часовом поясе UTC :)

1

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

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.

  • 0
    Я думаю нет. Для чистого кода это хорошая идея. Но мне это нужно по объему
  • 0
    @AlexanderBochkarev Вы можете вызвать use_zone в around_filter ( ApplicationController кажется хорошим местом для этого). Таким образом, любое ваше действие будет выполняться в часовом поясе пользователя.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню