2012-01-05 3 views
9

나는이 다음 모델 및 방법 :Date.yesterday가 Date.today로 간주되는 이유는 무엇입니까?

내 양식에 내 date_select 필드 :purchase_date 2012년 1월 4일 ( yesterday 방법) 그것은 또한 오늘 ( today 방법)으로 계산을 주면 왜
class UserPrice < ActiveRecord::Base 
    attr_accessible :price, :purchase_date,  

    def self.today 
    where(:purchase_date => Date.today) 
    end 

    def self.yesterday 
    where(:purchase_date => Date.yesterday) 
    end 

내가 줄 경우 2012 년 1 월 5 일 (오늘) 그것은 무효입니까?

P. PostgreSQL과 함께 레일 3.0.10을 사용하고 있습니다.


업데이트

이 내 콘솔 반환 :

$ rails console --s 
Loading development environment in sandbox (Rails 3.0.10) 
Any modifications you make will be rolled back on exit 
irb(main):001:0> Date.today 
=> Wed, 04 Jan 2012 
irb(main):002:0> Time.now 
=> 2012-01-04 21:28:07 -0500 
irb(main):003:0> Time.zone.now 
=> Thu, 05 Jan 2012 02:28:18 UTC +00:00 
irb(main):004:0> Date.yesterday 
=> Wed, 04 Jan 2012 
irb(main):005:0> 

이제 yesterday가 나사 고정

는, 말도 안돼 .... 이것은 계산하기 때문에 무슨 일이 일어나고

+1

[이 질문]에 대한 답변 (http://stackoverflow.com/questions/2944018/rails- 3 시간대 오류) 도움이 될 수 있습니다. – holygeek

+0

@holygeek 좋은 지적으로, 나는 콘솔에서 내 문제를 되 돌린다. – LearningRoR

답변

10

. rb가 구성된 표준 시간대에 대한 Date 클래스의 "현재"메서드를 호출하고 있습니다 (기본값은 UTC).

Time.zone.today 

이 아마 내일의 날짜가 표시됩니다 : 당신은 레일 콘솔을 열면

당신은 "Date.yesterday는"일에 의해 계산되는 날짜를 볼 수 있습니다. 그래서 어제는 오늘날과 같이 레일이 보는 것에 대한 것이 었습니다. ;)

당신은 수행하여보다 직접적으로 날짜 라이브러리로 작업 할 수 있습니다

: 당신이 active_support 반면 기대처럼

Date.today.advance(:days => -1) 

이 당신에게 어제의 날짜를 줄 것이다는 반환 :

Date.current.advance(:days => -1) 
+0

고맙습니다. 고맙습니다. – LearningRoR

+0

더 읽기 쉬운 것은'1.day.ago'를 사용하는 것입니다. 그러면 어제의 날짜가 예상대로됩니다. – Jiemurat

0

당신은을 사용하는 경우 Time 클래스의 경우 Date 클래스의 환경 시간대를 사용하는 대신 UTC (또는 "zulu") 시간대에 액세스 할 수 있습니다. 또한

class UserPrice < ActiveRecord::Base 
    attr_accessible :price, :purchase_date,  

    def self.today 
    where(purchase_date: today_utc_date) 
    end 

    def self.yesterday 
    where(purchase_date: today_utc_date.yesterday) 
    end 

    private 

    def today_utc_date 
    @today ||= Time.zone.today 
    end 
end 

, 당신은 예를 params[:purchase_date]를 들어, 외부 일을 처리해야하는 경우 :

Time.parse(params[:purchase_date]).utc.to_date 
관련 문제