如何在Ruby中找到两个Date对象之间的天数?

Bri*_*rig 136 ruby date

如何找到两个Date对象之间的天数?

Agi*_*edi 165

从结束日期减去开始日期:

endDate - beginDate 
Run Code Online (Sandbox Code Playgroud)

  • 那种虎头蛇尾的呃? (94认同)
  • 还要注意,减去两个`Date`对象会给你一个`Rational`,你可能需要将它转换成一个整数,就像`(endDate - beginDate).to_i` (39认同)
  • 注意:如果你在irb中使用Wirble(为输出着色),有理数将连续1到最后.哎呀!您可能希望使用to_i将结果转换为整数 (18认同)
  • 如果你有一个 `DateTime` 对象,一定要先转换为 `Date`,否则它返回秒数(我猜)。 (8认同)
  • 认为你的意思是从结束日期减去开始日期:) (2认同)

Rya*_*nJM 97

irb(main):005:0> a = Date.parse("12/1/2010")
=> #<Date: 4911063/2,0,2299161>

irb(main):007:0> b = Date.parse("12/21/2010")
=> #<Date: 4911103/2,0,2299161>

irb(main):016:0> c = b.mjd - a.mjd
=> 20
Run Code Online (Sandbox Code Playgroud)

这使用修改的朱利安日数.

来自维基百科:

朱利安日期(JD)是自公元前4713年1月1日格林威治中午,朱利安预感日历以来的时间间隔(以天为单位).


Joe*_*ico 50

这可能在Ruby 2.0中有所改变

当我这样做时,我得到了一小部分.例如在控制台上(irb或rails c)

2.0.0-p195 :005 > require 'date'
 => true 
2.0.0-p195 :006 >  a_date = Date.parse("25/12/2013")
 => #<Date: 2013-12-25 ((2456652j,0s,0n),+0s,2299161j)> 
2.0.0-p195 :007 >  b_date = Date.parse("10/12/2013")
 => #<Date: 2013-12-10 ((2456637j,0s,0n),+0s,2299161j)> 
2.0.0-p195 :008 > a_date-b_date
 => (15/1) 
Run Code Online (Sandbox Code Playgroud)

当然,转换为int会给出预期的结果

2.0.0-p195 :009 > (a_date-b_date).to_i
 => 15 
Run Code Online (Sandbox Code Playgroud)

这也适用于DateTime对象,但您必须考虑秒,例如此示例

2.0.0-p195 :017 >   a_date_time = DateTime.now
 => #<DateTime: 2013-12-31T12:23:03-08:00 ((2456658j,73383s,725757000n),-28800s,2299161j)> 
2.0.0-p195 :018 > b_date_time = DateTime.now-20
 => #<DateTime: 2013-12-11T12:23:06-08:00 ((2456638j,73386s,69998000n),-28800s,2299161j)> 
2.0.0-p195 :019 > a_date_time - b_date_time
 => (1727997655759/86400000000) 
2.0.0-p195 :020 > (a_date_time - b_date_time).to_i
 => 19 
2.0.0-p195 :021 > c_date_time = a_date_time-20
 => #<DateTime: 2013-12-11T12:23:03-08:00 ((2456638j,73383s,725757000n),-28800s,2299161j)> 
2.0.0-p195 :022 > a_date_time - c_date_time
 => (20/1) 
2.0.0-p195 :023 > (a_date_time - c_date_time).to_i
 => 20 
Run Code Online (Sandbox Code Playgroud)


wie*_*990 28

在Ruby 2.1.3中,事情发生了变化:

> endDate = Date.new(2014, 1, 2)
 => #<Date: 2014-01-02 ((2456660j,0s,0n),+0s,2299161j)> 
> beginDate = Date.new(2014, 1, 1)
 => #<Date: 2014-01-01 ((2456659j,0s,0n),+0s,2299161j)> 
> days = endDate - beginDate
 => (1/1) 
> days.class
 => Rational 
> days.to_i
 => 1 
Run Code Online (Sandbox Code Playgroud)


mpu*_*ach 16

这个怎么样?

(beginDate...endDate).count
Run Code Online (Sandbox Code Playgroud)

Range是一组独特的连续剧.并且...是一个独家的Range文字.

所以beginDate..(endDate - 1)是一样的.除非不是.

如果beginDate等于endDate,则第一个元素将因唯一性而被排除,...并将排除最后一个元素.因此,如果我们想要.count在今天和今天之间的日期,它将返回0.


Hen*_*k T 9

这为我工作:

(endDate - beginDate).to_i
Run Code Online (Sandbox Code Playgroud)


And*_*are 6

试试这个:

num_days = later_date - earlier_date
Run Code Online (Sandbox Code Playgroud)


dab*_*ert 6

所有这些都把我引向了正确的结果,但我最终做了

DateTime.now.mjd - DateTime.parse("01-01-1995").mjd
Run Code Online (Sandbox Code Playgroud)

  • @rickumali作为来自世界其他地方的成员,我感谢Ruby使用"我们的"默认日期格式. (14认同)
  • @rickumali Ruby也接受了`YYYY-MM-DD`格式的日期,这是每个人都应该使用的. (7认同)