Risposte:
Con le classi Date (e DateTime) puoi fare (end_date - start_date).to_i
per ottenere la differenza del numero di giorni.
Time
gli oggetti restituiscono però dei secondi.
Time
oggetti, non agli Date
oggetti. Forse potresti aggiornare la denominazione nel tuo commento per riflettere che non sono date?
Supponendo che end_date
e start_date
sono entrambi di classe ActiveSupport::TimeWithZone
in Rails, allora si può usare:
(end_date.to_date - start_date.to_date).to_i
(Time.zone.now.to_date - 23.hours.ago.to_date).to_i
, dà 1 e dovrebbe essere 0
Time.zone.now.to_date
restituisce "Mer, 15 nov 2017", mentre 23.hours.ago.to_date
restituisce "Mar, 14 nov 2017". La differenza nel numero di giorni è e dovrebbe essere 1 a meno che non sia stato eseguito il codice nell'ora prima di mezzanotte.
Rails ha alcuni helper integrati che potrebbero risolverlo per te. Una cosa da tenere a mente è che questo fa parte degli Helpview di Actionview, quindi non saranno disponibili direttamente dalla console.
Prova questo
<% 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"
Continuavo a ottenere risultati in pochi secondi, quindi questo ha funzionato per me:
(Time.now - self.created_at) / 86400
1.day
non è ruby
come richiesto dall'OP (nei tag). È Rails
o più specifico active support
anche se in created_at
pratica è un Model
metodo in Rails
tal modo ...
per ottenere il numero di giorni in un intervallo di tempo (solo un conteggio di tutti i giorni)
(start_date..end_date).count
(start_date..end_date).to_a.size
#=> 32
per ottenere il numero di giorni tra 2 date
(start_date...end_date).count
(start_date...end_date).to_a.size
#=> 31
Nessuna delle risposte precedenti (a questa data) fornisce la differenza corretta in giorni tra due date.
Quello che si avvicina di più è quello che è umido . Una risposta completa verrebbe convertita to_i
e quindi divisa:
(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
Nell'esempio specifico della domanda, non si dovrebbe analizzare Date
se il tempo trascorso è rilevante. Usa Time.parse
invece.
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