Odpowiedzi:
Za pomocą klas Date (i DateTime) możesz (end_date - start_date).to_iuzyskać różnicę w liczbie dni.
Timeobiekty zwracają jednak sekundy.
Timeobiektów, a nie Dateobiektów. Może mógłbyś zaktualizować nazewnictwo w swoim komentarzu, aby odzwierciedlić, że nie są to daty?
Zakładając, że end_datei start_dateoba są klasą ActiveSupport::TimeWithZonew Railsach, możesz użyć:
(end_date.to_date - start_date.to_date).to_i
(Time.zone.now.to_date - 23.hours.ago.to_date).to_i, daje 1 i powinno być 0
Time.zone.now.to_datezwraca „Wed, 15 Nov 2017”, a 23.hours.ago.to_datezwraca „Tue, 14 Nov 2017”. Różnica w liczbie dni wynosi i powinna wynosić 1, chyba że uruchomiłeś kod na godzinę przed północą.
Railsy mają wbudowanych pomocników, które mogą rozwiązać ten problem. Należy pamiętać, że jest to część pomocników Actionview, więc nie będą one dostępne bezpośrednio z konsoli.
Spróbuj tego
<% 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"
aby uzyskać liczbę dni w zakresie czasowym (tylko liczba wszystkich dni)
(start_date..end_date).count
(start_date..end_date).to_a.size
#=> 32
aby uzyskać liczbę dni między dwiema datami
(start_date...end_date).count
(start_date...end_date).to_a.size
#=> 31
Żadna z poprzednich odpowiedzi (do tej pory) nie podaje prawidłowej różnicy w dniach między dwiema datami.
Ten, który jest najbliżej, jest godny . Pełna odpowiedź przekształciłaby, to_ia następnie podzieliłaby:
(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
W konkretnym przykładzie pytania nie należy analizować, Dateczy upływający czas jest istotny. Użyj Time.parsezamiast tego.
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