Как узнать количество дней между двумя объектами Date в Ruby? - PullRequest
130 голосов
/ 21 декабря 2010

Как узнать количество дней между двумя объектами Date?

Ответы [ 9 ]

156 голосов
/ 21 декабря 2010

Вычтите дату начала из даты окончания:

endDate - beginDate 
93 голосов
/ 21 декабря 2010
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) - это интервал времени в днях и долях дня с 1 января 4713 г. до н.Юлианский пролептический календарь.

49 голосов
/ 01 января 2014

Это может измениться в 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) 

Конечно, приведение к 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 
27 голосов
/ 06 октября 2014

В 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 
12 голосов
/ 19 октября 2016

Как насчет этого?

(beginDate...endDate).count

The Range - это набор уникальных сериалов.И ... - это исключительный литерал Range.

То есть beginDate..(endDate - 1) - то же самое.За исключением случаев.

Если beginDate равно endDate , первый элемент будет исключен из-за уникальности, а ... исключит последний.Так что если мы хотим .count дат между сегодняшним днем ​​и сегодняшним днем, он вернет 0.

6 голосов
/ 28 июня 2017

Это сработало для меня:

(endDate - beginDate).to_i
6 голосов
/ 12 июля 2013

все это привело меня к правильному результату, но я закончил делать

DateTime.now.mjd - DateTime.parse("01-01-1995").mjd
6 голосов
/ 21 декабря 2010

Попробуйте это:

num_days = later_date - earlier_date
0 голосов
/ 26 ноября 2014

дней = (endDate - beginDate) / (60 * 60 * 24)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...