2012-01-05 14 views
9

मैं निम्नलिखित मॉडल और तरीकों:दिनांक क्यों है। कल दिनांक के रूप में गिना जाता है। आज भी?

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 

क्यों मेरी फार्म पर अगर मैं अपने date_select क्षेत्र :purchase_date 2012/01/04 (yesterday विधि) यह भी आज (today विधि) के रूप में गिना देना और अगर मैं दे यह 1/5/2012 (आज) यह शून्य है?

पीएस मैं 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

इसका कारण यह है गणना हो रहा है। आरबी कॉन्फ़िगर किए गए टाइमज़ोन (यूटीसी के लिए डिफ़ॉल्ट) के लिए दिनांक वर्ग की "वर्तमान" विधि को कॉल कर रहा है।

आप रेल कंसोल खोलें यदि आप तारीख, जिस पर "Date.yesterday" करके पर गणना कर रहा है देख सकते हैं:

Time.zone.today 

यह शायद आप कल की तारीख दिखाएगा। तो तिथि। कल के रूप में आज के रूप में क्या रेल देखता है, आज है। ;)

आप ऐसा करके अधिक सीधे दिनांक पुस्तकालय के साथ काम कर सकते हैं:

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

इस तरह आप active_support जबकि उम्मीद आप कल की तारीख दे देंगे लौटा रहा है:

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

धन्यवाद सर, मैं इसकी सराहना करता हूं। – LearningRoR

+0

अधिक पढ़ने योग्य एक '1.day.ago' का उपयोग करना है, जो आपको कल की तारीख देता है जैसा आप उम्मीद करते हैं। – Jiemurat

0

आप का उपयोग करते हैं Time कक्षा, Date कक्षा में पर्यावरण के समय क्षेत्र का उपयोग करने के बजाय आपको यूटीसी (या "ज़ुलू") समय क्षेत्र तक पहुंच होगी।

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 
संबंधित मुद्दे