Ruby'deki iki Date nesnesi arasındaki gün sayısını nasıl bulabilirim?


141

İki Date nesnesi arasındaki gün sayısını nasıl bulabilirim?

Yanıtlar:


170

Başlangıç ​​tarihini bitiş tarihinden çıkartın:

endDate - beginDate 

2
sanırım başlangıç ​​tarihini bitiş tarihinden
çıkartın

99
ne tür bir antiklimaktik ha?
Brig

18
not: irb'de Wirble kullanıyorsanız (çıktıyı renklendirmek için) rasyonel sayının sonuna birleştirilmiş 1 olur. yikes! sonucu bir tamsayıya dönüştürmek için to_i kullanabilirsiniz
jwal

9
Bir DateTimenesneniz varsa, önce dönüştürdüğünüzden emin olun Date, aksi takdirde saniye sayısını döndürür (sanırım).
Joshua Muheim

44
ayrıca iki çıkarılarak notu Datenesneleri size verir Rationalsize olduğu gibi, bir tamsayı içine typecasting gerekebileceğini(endDate - beginDate).to_i
MusikAnimal

98
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

Bu, Değiştirilmiş Julian Günü Numarası kullanır .

Gönderen wikipedia :

Jülyen tarihi (JD), MÖ 1 Ocak 4713 Greenwich öğleden sonra, Julian proleptik takviminin gün ve gün fraksiyonlarıdır.


53

Bu Ruby 2.0'da değişmiş olabilir

Bunu yaptığımda bir kesir elde ediyorum. Örneğin konsolda (irb veya raylar 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) 

Tabii ki, bir int için döküm beklenen sonucu verir

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

Bu DateTime nesneleri için de geçerlidir, ancak bu örnek gibi saniyeleri dikkate almanız gerekir

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 

29

Ruby 2.1.3'te işler değişti:

> 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 

21

Buna ne dersin?

(beginDate...endDate).count

Aralık, bir dizi benzersiz seri. Ve ...özel bir Range değişmezidir.

Yani beginDate..(endDate - 1)aynıdır. Dışında değil.

BeginDate öğesinin endDate değerine eşit olması durumunda , benzersizlik nedeniyle ilk öğe hariç tutulur ve ...son öğe hariç tutulur . .countBugün ile bugün arasındaki tarihler istiyorsak 0 döndürür.


Bu çok iyi bir cevaptır, beginDate, endDate'den daha eskiyse 0, bazı durumlarda mükemmel çalışan geri dönecektir . Ayrıca, iki tarih aynıysa 0 değerini döndürür. Ayrıca düz bir tamsayı döndürür. Diğer cevapların tamsayılara dönüştürülmesi gerekir veya sonuç negatifse 0'a çevirmeniz gerekebilir.
EmmanuelB

8

Bu benim için çalıştı:

(endDate - beginDate).to_i


6

bunların hepsi beni doğru sonuca götürdü, ama

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

Belirtilmesi gereken bir ipucu: Ruby'deki DateTime.parse, tarihin GG / AA / YYYY veya GG-AA-YYYY olarak verilmesini bekler. Amerikalı olarak, beni hep atar!
rickumali

15
@rickumali Dünyanın geri kalanından bir üye olarak, Ruby'ye varsayılan tarih biçimimizi kullandığından dolayı teşekkür ediyorum.
Claudio Holanda

7
@rickumali Ruby tarih YYYY-MM-DDbiçimini de kabul eder , bu da herkesin zaten kullanması gereken şeydir.
user513951

1

gün = (bitişTarihi - beginTarih) / (60 * 60 * 24)


5
Tarih gün cinsindendir, bu yüzden bunu yapmanız gerekmez. Çözümünüzün DateTime farklarıyla alakalı olduğunu düşünüyorum.
suga_shane

1

"Ara" ile ne demek istediğine dikkat et ...

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.