为什么Date.yesterday也算作Date.today呢?

Lea*_*RoR 10 ruby ruby-on-rails ruby-on-rails-3

我有以下模型和方法:

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
Run Code Online (Sandbox Code Playgroud)

为什么在我的表格上,如果我给我的date_select字段1/4/2012 :purchase_date(yesterday方法)它也算作今天(today方法),如果我给它1/5/2012(今天)它是零?

PS我正在使用Rails 3.0.10和PostgreSQL.


更新

这是我的控制台返回:

$ 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>
Run Code Online (Sandbox Code Playgroud)

现在yesterday搞砸了,毫无意义....

小智 11

发生这种情况是因为calculate.rb正在为配置的时区调用Date类的"当前"方法(默认为UTC).

如果您打开rails控制台,您可以通过执行以下操作查看"Date.yesterday"计算的日期:

Time.zone.today
Run Code Online (Sandbox Code Playgroud)

这可能会告诉你明天的约会.所以今天看到今天铁路看到的Date.yesterday.;)

通过执行以下操作,您可以更直接地使用日期库:

Date.today.advance(:days => -1)
Run Code Online (Sandbox Code Playgroud)

这将给你昨天的日期,就像你期望的那样,而active_support正在返回:

Date.current.advance(:days => -1) 
Run Code Online (Sandbox Code Playgroud)