2012-10-16 5 views
1

올해 Rails Rumble에 참여했습니다. 시간대 문제로 인해 얽혀 버렸습니다.레일 3.2.8 - 시간대 처리 방법?

내 응용 프로그램을 linode에 업로드했으며 EST 표준 시간대 또는 -4 시부 터 UTC에 살고 있습니다.

나는 모델을 가지고하고 다음을 수행하여 일을 저장합니다

def self.processing_creation(user_id, home_id, chore_id) 
    registered_chore = RegisteredChore.where("DATE(created_at) = ?", Date.today).find_by_user_id_and_home_id_and_chore_id(user_id, home_id, chore_id) 
    unless registered_chore 
    registered_chore = RegisteredChore.create(user_id: user_id, home_id: home_id, chore_id: chore_id, created_at: Time.zone.now) 
    user = registered_chore.user 
    user.add_one_chore_point 
    end 
    registered_chore 
end 

RegisteredChore.where ("? DATE (created_at를) =", Date.today)이 .find_by_user_id_and_home_id_and_chore_id (USER_ID, home_id, chore_id)

은 데이터가 방금 생성 된 경우에도 false를 반환합니다.

"만들기"는 UTC로 저장되지만 Date.today는 사용자의 현지 시간대를 사용합니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

또 다른 예

문제를 설명하기 :

  1. 내가 EST 시간 오후 11시 기계에 의존을 등록 할 수 있습니다.
  2. 서버가 이미 다음날에 있습니다 (예 : 12).
  3. 레일즈는 다음날 날짜 (12)에 데이터를 저장합니다.
  4. 그러나 사용자는 아직 11 일째입니다.
  5. 기술적으로 보면 현재의 방법을 사용하는 사용자는 일이 db 및 사용자 인터페이스와 다르기 때문에 항목을 다시 저장할 수 있습니다.

어떻게 해결할 수 있습니까?

답변

1

레일스는 기본적으로 UTC로 데이터베이스에 시간을 저장합니다. DATE([Date.today])을 사용하는 경우 12 번째가 아닌 11 번째 레코드를 검색합니다. 올바른 날짜를 얻으려면 Time.zone을 사용자의 현재 시간대로 설정 한 다음 쿼리를 수행하는 것이 좋습니다.

나는 이런 종류의 날짜 검색을 처리하기 위해 by_star이라는 보석을 만들었고, 나는 그것을 사용해야한다고 생각한다. 이를 통해 쿼리는 다음과 같습니다.

RegisteredChore.today.where(:user_id => user.id, 
          :home_id => home.id, 
          :chore_id => chore.id) 
1

레일 3은 기본적으로 모든 시간을 GMT + 00 : 00 시간대로 데이터베이스에 저장합니다. 따라서 시간대에 따라 시간을 계산하는 동안 오프셋을 설정해야합니다. 그렇지 않으면 application.rb

config.time_zone = 'Your time zone' (Example: 'Eastern Time (US & Canada)') 
config.active_record.default_timezone = 'Your time zone' (Example: 'Eastern Time (US & Canada)') 
에 다음을 추가하여 기본 Activerecord 시간대를 변경할 수 있습니다.
관련 문제