Antworten:
Mit den Klassen Date (und DateTime) können Sie (end_date - start_date).to_i
die Differenz der Anzahl der Tage ermitteln.
Time
Objekte geben jedoch Sekunden zurück.
Time
Objekte bezieht , nicht auf Date
Objekte. Vielleicht könnten Sie die Benennung in Ihrem Kommentar aktualisieren, um anzuzeigen, dass es sich nicht um Daten handelt?
Unter der Annahme , dass end_date
und start_date
sind beide Klasse ActiveSupport::TimeWithZone
in Rails, dann können Sie verwenden:
(end_date.to_date - start_date.to_date).to_i
(Time.zone.now.to_date - 23.hours.ago.to_date).to_i
, es gibt 1 und sollte 0 sein
Time.zone.now.to_date
"Mi, 15. November 2017" und 23.hours.ago.to_date
"Di, 14. November 2017" zurückgegeben. Der Unterschied in der Anzahl der Tage ist und sollte 1 sein, es sei denn, Sie haben Ihren Code in der Stunde vor Mitternacht ausgeführt.
Rails hat einige eingebaute Helfer , die dies für Sie lösen könnten. Beachten Sie, dass dies Teil der Actionview-Helfer ist und daher nicht direkt über die Konsole verfügbar ist.
Versuche dies
<% 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"
Ich habe in Sekundenschnelle Ergebnisse erzielt, also hat das bei mir funktioniert:
(Time.now - self.created_at) / 86400
1.day
ist nicht ruby
wie OP angefordert (in Tags). Es ist Rails
noch spezifischere active support
obwohl created_at
ist im Grunde ein Model
Verfahren in Rails
so ..
um die Anzahl der Tage in einem Zeitbereich zu erhalten (nur eine Zählung aller Tage)
(start_date..end_date).count
(start_date..end_date).to_a.size
#=> 32
um die Anzahl der Tage zwischen 2 Daten zu erhalten
(start_date...end_date).count
(start_date...end_date).to_a.size
#=> 31
Keine der vorherigen Antworten (bis zu diesem Datum) gibt den korrekten Unterschied in Tagen zwischen zwei Daten an.
Derjenige , der am nächsten kommt, ist von diesem Dankent . Eine vollständige Antwort würde konvertieren to_i
und dann teilen:
(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
Im konkreten Beispiel der Frage sollte nicht analysiert werden, Date
ob die verstrichene Zeit relevant ist. Verwenden Sie Time.parse
stattdessen.
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