Réponses:
Avec les classes Date (et DateTime), vous pouvez faire (end_date - start_date).to_i
pour obtenir le nombre de jours de différence.
Time
les objets renvoient cependant des secondes.
Time
objets, pas à des Date
objets. Peut-être pourriez-vous mettre à jour la dénomination dans votre commentaire pour indiquer qu'il ne s'agit pas de dates?
En supposant que end_date
et qu'ils start_date
soient tous deux de classe ActiveSupport::TimeWithZone
dans Rails, vous pouvez utiliser:
(end_date.to_date - start_date.to_date).to_i
(Time.zone.now.to_date - 23.hours.ago.to_date).to_i
, il donne 1 et devrait être 0
Time.zone.now.to_date
renvoie maintenant "Wed, 15 Nov 2017", tandis que 23.hours.ago.to_date
renvoie "Tue, 14 Nov 2017". La différence en nombre de jours est et doit être de 1, sauf si vous avez exécuté votre code dans l'heure précédant minuit.
Rails a des aides intégrées qui pourraient résoudre ce problème pour vous. Une chose à garder à l'esprit est que cela fait partie des Helpers Actionview, donc ils ne seront pas disponibles directement depuis la console.
Essaye ça
<% 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"
J'ai continué à obtenir des résultats en quelques secondes, donc cela a fonctionné pour moi:
(Time.now - self.created_at) / 86400
1.day
n'est pas ruby
comme OP demandé (dans les balises). C'est Rails
ou plus spécifique active support
si created_at
c'est fondamentalement une Model
méthode dans Rails
so ..
pour obtenir le nombre de jours dans une plage horaire (juste un décompte de tous les jours)
(start_date..end_date).count
(start_date..end_date).to_a.size
#=> 32
pour obtenir le nombre de jours entre 2 dates
(start_date...end_date).count
(start_date...end_date).to_a.size
#=> 31
Aucune des réponses précédentes (à ce jour) ne donne la différence correcte en jours entre deux dates.
Celui qui se rapproche le plus est celui- là . Une réponse complète convertirait to_i
puis diviserait:
(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
Dans l'exemple spécifique de la question, il ne faut pas analyser Date
si le temps écoulé est pertinent. Utilisez Time.parse
plutôt.
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