2012-03-05 21 views

risposta

161

con la data (e DateTime) le classi si può fare (end_date - start_date).to_i per ottenere il numero di giorni differenza.

+0

sì, ma l'utente ha delle stringhe e non puoi farlo con le stringhe. Ne hai bisogno come date. Vedi la mia risposta per aggiungere to_date dalle estensioni principali. –

+5

@MichaelDurrant Stai assumendo un'ipotesi ingiustificata. L'utente non specifica se sono stringhe o meno. Infatti, dal momento che stanno usando Rails è molto probabile che le date provengano da ActiveRecord, che le getterà automaticamente su oggetti data. Il testo dato è identico alla rappresentazione dell'oggetto Date, il che rende altamente probabile che provenga da una fonte nativa. –

+1

Corretto, suppongo che l'utente abbia provato a - b e non ha funzionato, quindi hanno finito con la pubblicazione su SO. Immagino che solo andkjaer possa dirci il vero affare :) –

-7
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

molto più facile per sottrarre gli oggetti di data. – holaSenor

+0

L'OP non ha mai chiesto informazioni sulla regolazione per i giorni lavorativi. Questo è davvero contorto in ogni caso. – Nathan

25

Rails è un po 'costruito in helpers che potrebbe risolvere questo problema per voi. Una cosa da tenere a mente è che questo fa parte degli Helpers di Actionview, quindi non saranno disponibili direttamente dalla console.

Prova questa

<% 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" 
81

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 
+1

Se ha a che fare con i campi della tabella, questa risposta è la strada da percorrere; invece di quello più votato qui. – Ben

+0

non funziona per '(Time.zone.now.to_date - 23.hours.ago.to_date) .to_i', dà 1 e dovrebbe essere 0 –

+0

@YuriGhensev, dipende da quando si esegue il codice di esempio, per esempio in questo momento "Time.zone.now.to_date' restituisce" Wed, 15 nov 2017 ", mentre' 23.hours.ago.to_date' restituisce "Tue, 14 nov 2017". La differenza nel numero di giorni è e dovrebbe essere 1 a meno che il codice non sia stato eseguito nell'ora prima di mezzanotte. – lee

21

ho continuato a ottenere risultati in pochi secondi, quindi questo ha funzionato per me:

(Time.now - self.created_at)/86400 
+4

Forse '/ 1.day' è più leggibile. – Epigene

+0

@Epigene '1.day' non è' ruby' come richiesto OP (nei tag). È 'Rails' o più specifico' supporto attivo' sebbene 'created_at' sia fondamentalmente un metodo' Model' in 'Rails' quindi .. – Roko

3

a 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 
6

nessuna delle risposte precedenti (ad oggi) dà la differenza corretta in giorni tra due date.

Quello più vicino è il thatdankent. Una risposta completa convertirebbe to_i e poi dividere:

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

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

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

Nel caso specifico della questione, non si deve Analizza per Date se il tempo trascorso è rilevante. Utilizzare invece Time.parse.

0

di avere il numero di giorni interi tra due date (DateTime oggetti):

Problemi correlati