如何查找两个 Date 对象之间的天数?
试试这个:
num_days = later_date - earlier_date
从结束日期减去开始日期:
endDate - beginDate
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
这使用 改良儒略日号码。
来自 维基百科:
儒略日(JD)是公元前4713年1月1日格林威治中午以来,以天和分数为单位的时间间隔。
所有这些都指引我走向正确的结果,但我最终做到了
DateTime.now.mjd - DateTime.parse("01-01-1995").mjd
这在 Ruby 2.0中可能已经改变了
当我这样做的时候,我得到一个分数,例如在控制台上(irb 或者 Railsc)
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)
当然,转换为 int 会得到预期的结果
2.0.0-p195 :009 > (a_date-b_date).to_i => 15
这也适用于 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
在 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
Days = (endDate-startDate)/(60 * 60 * 24)
这个怎么样?
(beginDate...endDate).count
山脉是一套独特的系列。 ...是独占的 Range 文字。
...
所以 beginDate..(endDate - 1)是一样的,除了不一样。
beginDate..(endDate - 1)
当 开始日期等于 结束日期时,由于唯一性,第一个元素将被排除,而 ...将排除最后一个元素。因此,如果我们想要 .count日期之间的今天和今天,它将返回0。
.count
这对我很有效:
(endDate - beginDate).to_i
好吧,也注意一下你说的“中间”是什么意思..。
days_apart = (to - from).to_i # from + days_apart = to total_days = (to - from).to_i + 1 # number of "selected" days in_between_days = (to - from).to_i - 1 # how many days are in between from and to, i.e. excluding those two days