2012-01-05 11 views
9

Ho il seguente modello e metodi:Perché Date.yesterday conta anche come Date.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 

Perché sulla mia forma, se io do la mia date_select campo :purchase_date 1/4/2012 (yesterday metodo) conta anche come oggi (today metodo) e se mi danno it 1/5/2012 (oggi) è nulla?

P.S. Sto usando Rails 3.0.10 con PostgreSQL.


Aggiornamento

Questo è il mio rendimento della console:

$ 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> 

Ora yesterday è avvitato, non ha senso ....

+1

La risposta a [questa domanda] (http://stackoverflow.com/questions/2944018/rails- 3-timezone-error) può aiutare. – holygeek

+0

@holygeek Buon punto, ho dato un'occhiata alla console che restituisce il mio problema. – LearningRoR

risposta

10

questo sta accadendo perché i calcoli. rb chiama il metodo "current" della classe Date per il fuso orario configurato (Defaults to UTC).

Se si apre la console rotaie si può vedere la data in cui "Date.yesterday" sta calcolando il facendo:

Time.zone.today 

Questo probabilmente vi mostrerà la data di domani. Quindi Date.yesterday per quello che le rotaie vedono oggi, è oggi. ;)

È possibile lavorare con la libreria Data più direttamente facendo:

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

Questo vi darà la data di ieri, come ci si aspetta, mentre active_support sta tornando:

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

Grazie signore, lo apprezzo. – LearningRoR

+0

Più leggibile è usare '1.day.ago', che ti dà la data di ieri come ti aspetti. – Jiemurat

0

Se si utilizza il Classe Time, avrai accesso al fuso orario UTC (o "zulu") anziché utilizzare il fuso orario dell'ambiente nella classe 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 

Inoltre, se hai bisogno di elaborare una data al di fuori, per esempio params[:purchase_date]:

Time.parse(params[:purchase_date]).utc.to_date