我受到了joda-time API的迷恋:
DateTime now = new DateTime();
DateTime ninetyDaysAgo = now.minusDays(90);
我正在尝试在Ruby中做类似的事情,但我是
now = Time.now
ninetyDaysAgo = now - (90*24)
然而,这里的数学是关闭的(我真的在午夜工作日期)。
日期减法是否有友好的API?
答案 0 :(得分:94)
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.now
答案 1 :(得分:12)
对于使用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
答案 2 :(得分: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
由于您使用的是日期而不是时间,因此您还应该从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)>
答案 3 :(得分:7)
Ruby支持Date and DateTime classes中的日期算术,它是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"
使用#<<和#>>方法操作数月而非数天。几个月的算术与几天的算术略有不同。使用Date而不是DateTime会使效果更明显。
> (Date.new(2015, 5, 31) << 3).to_s # May 31 - 3 months; 92 days diff
=> "2015-02-28"
按照joda-time示例,您可以在Ruby中编写类似的内容。
now = DateTime.now
ninety_days_ago = now - 90
或者只是
ninety_days_ago = DateTime.now - 90
答案 4 :(得分:5)
使用秒数:
Time.now - 90*24*60*60
答案 5 :(得分:4)
这是一篇超级老帖子,但是如果您希望保留Time
对象,就像最初被问到的那样,而不是切换到Date
对象,您可能需要考虑使用{{1 }}
Ruby Facets是核心Ruby类的扩展的标准化库。
http://rubyworks.github.io/facets/
通过要求Facets,您可以使用Time对象执行以下操作。
Ruby Facets
答案 6 :(得分:-1)
简单的解决方案:
days90_ago = 90.days.ago.to_date.to_s
OUTPUT:
puts 90_days_ago
=> "2019-10-09" # considering cur_date: 2020-01-07