Rubydate减法(例如90天前)

我已经被joda-time API糟糕了:

DateTime now = new DateTime(); DateTime ninetyDaysAgo = now.minusDays(90); 

我正在尝试在Ruby中做类似的事情,但我是

 now = Time.now ninetyDaysAgo = now - (90*24) 

然而,math在这里(我真的在午夜工作)。

date扣除有友好的API吗?

 require 'date' now = Date.today ninety_days_ago = (now - 90) 

运行这个通过IRB控制台,我得到:

 >>require 'date' now = Date.today ninety_days_ago = (now - 90) require 'date' => false now = Date.today => #<Date: 2011-03-02 (4911245/2,0,2299161)> ninety_days_ago = (now - 90) => #<Date: 2010-12-02 (4911065/2,0,2299161)> 

如果你需要的时间,你可以now = DateTime.nownow = DateTime.now

如果您使用的是Rails,或者不介意包含ActiveSupport,则可以像这样使用Numeric#days DSL:

 ruby-1.9.2-p136 :002 > Date.today => Wed, 02 Mar 2011 ruby-1.9.2-p136 :003 > Date.today - 90.days => Thu, 02 Dec 2010 

由于您使用date而不是时间,因此您还应该以Date实例开始,或者使用#to_date转换DateTime实例。 从date实例中添加/减去数字时,数字隐含date。

 ruby-1.9.2-p136 :016 > DateTime.now.to_date => #<Date: 2011-03-02 (4911245/2,0,2299161)> ruby-1.9.2-p136 :017 > DateTime.now.to_date - 90 => #<Date: 2010-12-02 (4911065/2,0,2299161)> 

对于那些使用Rails的人,请查看以下内容:

 DateTime.now - 10.days => Sat, 04 May 2013 12:12:07 +0300 20.days.ago - 10.days => Sun, 14 Apr 2013 09:12:13 UTC +00:00 

Ruby支持Date和DateTime类中的date算术,它们是Ruby标准库的一部分。 这两个类都暴露了#+和# -方法,这些方法会从date或时间中添加和减去天数。

 $ irb > require 'date' => true > (DateTime.new(2015,4,1) - 90).to_s # Apr 1, 2015 - 90 days => "2015-01-01T00:00:00+00:00" > (DateTime.new(2015,4,1) - 1).to_s # Apr 1, 2015 - 1 day => "2015-03-31T00:00:00+00:00" 

使用#<<和#>>方法来运行几个月而不是几天。 在几个月的算术与在几天的算术有一点不同。 使用date而不是date时间使效果更明显。

  > (Date.new(2015, 5, 31) << 3).to_s # May 31 - 3 months; 92 days diff => "2015-02-28" 

按照你的joda时间的例子,你可以在Ruby中写这样的东西。

 now = DateTime.now ninety_days_ago = now - 90 

或者也许只是

 ninety_days_ago = DateTime.now - 90 

这是一个超级老的post,但如果你想保持一个Time对象,就像最初被问到的,而不是切换到一个Date对象,你可能要考虑使用Ruby Facets

Ruby Facets是核心Ruby类的扩展标准库。

http://rubyworks.github.io/facets/

通过要求分面,您可以使用Time对象执行以下操作。

Time.now.less(90, :days)

使用秒数:

 Time.now - 90*24*60*60