İki tarih arasındaki gün sayısını sayın


149

Bu iki tarih arasındaki gün sayısını nasıl hesaplayabilirim?

start_date = Date.parse "2012-03-02 14:46:21 +0100"
end_date =  Date.parse "2012-04-02 14:46:21 +0200"

Yanıtlar:


207

Date (ve DateTime) sınıflarıyla (end_date - start_date).to_igün sayısı farkını elde etmek için yapabilirsiniz .


5
@MichaelDurrant Yanlış bir varsayım yapıyorsunuz. Kullanıcı dize olup olmadığını belirtmez. Aslında, Rails kullandıklarından, tarihlerin ActiveRecord'dan gelmesi büyük olasılıkla bunları otomatik olarak tarih nesnelerine gönderir. Verilen metin, Date nesnesi temsiliyle aynıdır ve bu da yerel bir kaynaktan gelmesi olasılığını artırır.
Andrew France

84
Bu bana raylar v3 / 4
2called-chaos

6
Ruby ve ActiveSupport'un son sürümlerinde davranışın aynı kaldığını söyleyebildiğim kadarıyla sırasıyla 2.0 ve 4.1.0'ı içeriyor. TimeNesneler saniyeler içinde geri döner.
Andrew France

5
@ 2called-chaos cevabını genişletmek, ihtiyacınız olan günleri almak için (end_date - start_date) /1.day. Tam günler geçirmek istiyorsanız yalnızca kullanabilirsiniz ((end_date - start_date) /1.day) .ceil
David K.

2
@David @ 2called-chaos tarafından yapılan yorumun yanlışlıkla Timenesnelere değil, Datenesnelere atıfta bulunması dışında . Belki yorumunuzdaki adları tarih olmadığını yansıtacak şekilde güncelleyebilirsiniz?
Andrew France

109

Rails'te sınıfın end_dateve start_dateher ikisinin de sınıf olduğunu varsayarsak, ActiveSupport::TimeWithZoneşunları kullanabilirsiniz:

(end_date.to_date - start_date.to_date).to_i

2
Tablo alanlarıyla ilgisi varsa, bu cevap gitmenin yoludur; burada en çok puan alan yerine.
Ben

İçin çalışmıyor (Time.zone.now.to_date - 23.hours.ago.to_date).to_io 1 verir ve 0 olmalıdır,
Yuri Ghensev

3
@YuriGhensev, örnek kodunuzu ne zaman çalıştırdığınıza bağlıdır, örneğin şu anda Time.zone.now.to_date"Çar, 15 Kas 2017", 23.hours.ago.to_date"Sal, 14 Kas 2017" döndürür. Gün sayısındaki fark, kodunuzu gece yarısından önceki saatte çalıştırmadıysanız 1 olmalıdır.
lee

35

Rails, bunu sizin için çözebilecek bazı yardımcılara sahiptir. Akılda tutulması gereken bir şey, bunun Actionview Helpers'ın bir parçası olduğu için doğrudan konsoldan kullanılamayacaklardır.

Bunu dene

<% start_time =  "2012-03-02 14:46:21 +0100" %>
<% end_time   =  "2012-04-02 14:46:21 +0200" %>
<%= distance_of_time_in_words(start_time, end_time)  %>

 "about 1 month"

@MaayanNaveh hesaplamalar için gerçek sayıya ihtiyacınız olduğunda olmamalıdır.
Fedcomp

Bu soru, sorunun kendisinin daha iyi sorulduğu farklı durumlardan biridir. Buradaki diğer yanıtları takip ederseniz, bazen gün yerine haftaların veya yılların gösterilmesini istediğiniz durumlarla karşılaşırsınız. Bu gerçekten "doğru" Raylar cevabı olarak kabul edilmelidir.
Dylan Pierce

34

Birkaç saniye içinde sonuç almaya devam ettim, bu yüzden bu benim için çalıştı:

(Time.now - self.created_at) / 86400

1
@ Epigene 1.day, rubyOP'nin istediği gibi değildir (etiketlerde). Bu Railsya da daha spesifik active supportolsa created_attemelde bir Modelyöntemdir Rails..
Roko

26

bir zaman aralığındaki gün sayısını elde etmek için (yalnızca tüm günlerin sayısı)

(start_date..end_date).count
(start_date..end_date).to_a.size
#=> 32

2 tarih arasındaki gün sayısını almak için

(start_date...end_date).count
(start_date...end_date).to_a.size
#=> 31

Bunun için teşekkürler @ a14m! Kapsayıcı ve özel tarih yakalamaları için bana bir yol verdi :)
Kris Boyd

18

Önceki yanıtların hiçbiri (bu tarihe kadar) iki tarih arasındaki günler arasında doğru farkı vermez.

En yakını o dankent . Tam bir cevap dönüştürülecek to_ive sonra bölünecektir:

(Time.now.to_i - 23.hours.ago.to_i) / 86400
>> 0

(Time.now.to_i - 25.hours.ago.to_i) / 86400
>> 1

(Time.now.to_i - 1.day.ago.to_i) / 86400
>> 1

Sorunun özel örneğinde, Dategeçen zamanın alakalı olup olmadığı ayrıştırılmamalıdır . Time.parseBunun yerine kullanın .


Zaman ilerleyen bir DST geçişini geçtiğinde bu beklendiği gibi çalışmayabilir. Bu durumda, DST geçiş gün uzunluğu yasal olarak 24 saatten azdır, ancak tamsayı aritmetiği nedeniyle o gün hiç yansıtılmayacaktır.
PinnyM

4

İki tarih ( DateTimenesne) arasındaki tam gün sayısına sahip olmak için :

((end_at - start_at).to_f / 1.day).floor

Yuri'nin verdiği cevapla aynı DST sorunu. Zamanla aritmetik asla beklediğiniz kadar basit değildir :)
PinnyM

0

Gün sayısı farkını iki tarihe göre almak için:

(start.to_date...end.to_date).count - 1
or 
(end.to_date - start.to_date).to_i

-8
def business_days_between(date1, date2)
  business_days = 0
  date = date2
  while date > date1
   business_days = business_days + 1 unless date.saturday? or date.sunday?
   date = date - 1.day
  end
  business_days
end

3
tarih nesnelerini çıkarmak çok daha kolay.
OpenCoderX

OP hiçbir zaman iş günleri için ayarlama yapmayı sormadı. Bu gerçekten de kıvrık.
Nathan
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.