Ruby Date Subtraction(例如90天前)

dar*_*ino 85 ruby date

我被joda-time API所迷恋:

DateTime now = new DateTime();
DateTime ninetyDaysAgo = now.minusDays(90);
Run Code Online (Sandbox Code Playgroud)

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

now = Time.now
ninetyDaysAgo = now - (90*24)
Run Code Online (Sandbox Code Playgroud)

然而,数学是在这里(我真的在午夜工作日期).

是否有友好的日期减法API?

Mat*_*att 97

require 'date'
now = Date.today
ninety_days_ago = (now - 90)
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Matt:如何减去90小时而不是几天? (3认同)

Abd*_*bdo 13

对于使用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
Run Code Online (Sandbox Code Playgroud)

  • 那是90.days.ago (4认同)

Gab*_*esy 10

如果你正在使用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 
Run Code Online (Sandbox Code Playgroud)

由于您使用的是日期而不是时间,因此您还应该从Date实例开始,或者使用#to_date转换DateTime的内容.在日期实例中添加/减去数字时,这些数字是隐含的天数.

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


Mik*_*ll' 8

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

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

使用#<<#>>方法可以在几个月而不是几天内运行.几个月的算术与几天的算术略有不同.使用Date而不是DateTime会使效果更明显.

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

按照joda-time示例,您可以在Ruby中编写类似的内容.

now =  DateTime.now
ninety_days_ago = now - 90
Run Code Online (Sandbox Code Playgroud)

或者只是

ninety_days_ago = DateTime.now - 90
Run Code Online (Sandbox Code Playgroud)


big*_*can 5

这是一篇非常古老的帖子,但是如果您想保留一个Time对象,就像最初被问到的那样,而不是切换到一个Date对象,您可能需要考虑使用Ruby Facets.

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

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

通过要求 Facets,您可以对 Time 对象执行以下操作。

Time.now.less(90, :days)


小智 5

使用秒数:

Time.now - 90*24*60*60
Run Code Online (Sandbox Code Playgroud)