2009-08-20 2 views
2

나는 필요한 모든 표준 시간대 정보를 가지고 있으며 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은 데이터베이스에 문자열 동부 표준시 (US & 캐나다)의 문자열로 저장됩니다.

이것을 알아내는 가장 좋은 방법은 데이터베이스에서 사용자의 오프셋을 저장하도록 변경할 수 있지만 그 전에는 더 쉬운 방법이 있는지보고 싶습니다.


더 명확하게하기 위해 편집, 쿼리 시간 카운트의 해시를 반환합니다. 그래서 예를 들면 : UTC는 시간 오프셋으로

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

는 시간이 돌아오고, 나는 사용자의 시간대로 그 자리를 변환해야하므로 예를 들어, 동부 표준시 (미국과 캐나다)를 통해 당신 루프의 경우 해시를 추가하고 시간에 -4를 더합니다.

편집 2
Andy 덕분에 나는 이것을 매우 간단하게 이해할 수있었습니다. 가장 먼저 할 일은 Time 객체를 현재 사용자의 시간대로 설정하는 것입니다. 그래서 :

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

그런 다음 해시

hour + Time.now.in_time_zone.utc_offset/3600 

예쁜 자명 내에서 현재 사용자의은 "시간"에 오프셋을 추가,하지만 그 이전에 설정 한 영역의 시간을 가져옵니다, 그리고 UTC 발견 오프셋을 초 단위로 표시하므로 3600으로 나눕니다.

+1

질문을 해결할 수 있습니까? 사용자의 시간대와 관련하여 시작/종료 시간을 지정 하시겠습니까? 아니면 쿼리가 작성된 후 UTC 시간을 사용자의 시간대로 변환 하시겠습니까? – klochner

+1

쿼리가 작성된 후 UTC 시간을 사용자의 시간대로 변환하십시오. – Ryan

답변

4

이 방법이 도움이됩니까?

내 답변 앞에 올린 사람은 누구나 내 대답보다 훨씬 낫습니다. 그가 대답을 되 찾는다면 나는 다시 내 것을 잡을 것이다.

+0

이것이 나에게 충분할 수도 있습니다. 조금만 업데이트 할 것입니다. – Ryan

+1

대단히 도움이되었습니다. 당신이 나에게 보여준 후에 10 분이 지나면 사용자 시간대로 시간 객체를 설정할 수 있습니다. 내가 한 일을보기 위해 편집을 참조하십시오.이 구문은 정말로 다른 유일한 것입니다. – Ryan

0
scope :opened, where("date > '#{Time.now.in_time_zone}'") 
scope :closed, where("date < '#{Time.now.in_time_zone}'")