web-dev-qa-db-fra.com

Comment trouver le nombre de jours entre deux objets Date dans Ruby?

Comment trouver le nombre de jours entre deux objets Date?

132
Brig

Soustrayez la date de début à la date de fin:

endDate - beginDate 
160
Agile Jedi
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

Ceci utilise un nombre de jours du calendrier Julien modifié .

De wikipedia :

La date julienne (JD) est l'intervalle de temps en jours et fractions de jour depuis le 1er janvier 4713 av. J.-C. midi Greenwich, calendrier proleptique Julian.

93
RyanJM

Cela a peut-être changé dans Ruby 2.0

Quand je fais cela, je reçois une fraction. Par exemple sur la console (soit irb ou 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) 

Bien sûr, le casting sur un int donne le résultat attendu

2.0.0-p195 :009 > (a_date-b_date).to_i
 => 15 

Cela fonctionne également pour les objets DateTime, mais vous devez prendre en compte les secondes, comme cet exemple.

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 
50
Joe Basirico

Dans Ruby 2.1.3 les choses ont changé:

> 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 
27
wieczorek1990

Que dis-tu de ça?

(beginDate...endDate).count

La gamme est un ensemble de séries uniques. Et ... Est un littéral Range exclusif.

Donc, beginDate..(endDate - 1) est identique. Sauf n'est pas.

Dans le cas où beginDate est égal à endDate, le premier élément sera exclu en raison de son unicité et ... Exclura le dernier. Donc, si nous voulons que .count Date entre aujourd'hui et aujourd'hui, il retournera 0.

14
mpugach

Cela a fonctionné pour moi:

(endDate - beginDate).to_i
9
Henok T

Essaye ça:

num_days = later_date - earlier_date
6
Andrew Hare

tout cela m'a conduit au bon résultat, mais j'ai fini par le faire

DateTime.now.mjd - DateTime.parse("01-01-1995").mjd
6
dabobert

days = (endDate - beginDate)/(60 * 60 * 24)

0
michael