ruby на рельсах, конвертирующих в часовой пояс пользователя - PullRequest
2 голосов
/ 21 августа 2009

У меня есть вся необходимая информация о часовом поясе, и она правильно сохраняет всю информацию в соответствии с this railscast . Все отлично работает для всех обычных целей, таких как отображение времени в таблице, однако мне интересно, как я могу преобразовать следующее в current_users сохраненный часовой пояс.

У меня есть общее количество вызовов в час:

Calls.count(:group => DATE_PART('hour', start_time), 
            :conditions => ["start_time BETWEEN ? AND ?", start, finish]

Этот запрос извлекает все звонки, которые были сделаны за час между временем начала и окончания. Единственное, что он тянет время назад в базе данных, которая хранится как UTC. Я написал свой собственный маленький метод преобразования с Time.now.utc_offset, но понял, что это не сработает. Что было бы хорошим способом сравнить сохраненные пользователи time_zone с тем, что идет из базы данных, и добавить utc_offset.

time_zone сохраняется в виде строки в базе данных Восточное время (США и Канада) .

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

Редактировать
Чтобы быть более понятным, запрос возвращает хэш часов и количество. Так, например:

                Hour                       Count
                "5"                          20
                "6"                          15
                "7"                          35
                ...                          ...

Час возвращается как часовой пояс UTC, мне нужно преобразовать эту цифру в часовой пояс пользователя, поэтому, например, если это Восточное время (США и Канада), вы перебираете хеш и добавляете -4 к час.

Редактировать 2
Благодаря Энди я смог понять это довольно просто. Первое, что вы хотите сделать, это установить для объекта Time текущий часовой пояс пользователя. Итак:

Time.zone = @current_user.time_zone
=> "Eastern Time (US & Canada)

Затем добавьте смещение текущего пользователя к «Часу» внутри хеша

hour + Time.now.in_time_zone.utc_offset / 3600

Довольно понятен, но он получает время зоны, которую вы установили ранее, и находит смещение UTC в секундах, поэтому мы делим на 3600.

Ответы [ 2 ]

4 голосов
/ 21 августа 2009

Помогает ли это?

t = TimeZone["Eastern Time (US & Canada)"]
t.utc_to_local(DateTime.now) #gives the local time

Кто бы ни писал передо мной, удалил свой ответ (это было намного лучше, чем мой ответ). Если он вернет свой ответ, я снова приму свой.

0 голосов
/ 22 ноября 2011
scope :opened, where("date > '#{Time.now.in_time_zone}'")
scope :closed, where("date < '#{Time.now.in_time_zone}'")
...