170 votes

Compter le nombre de jours entre deux dates

Comment puis-je compter le nombre de jours entre ces deux dates ?

start_date = Date.parse "2012-03-02 14:46:21 +0100"
end_date =  Date.parse "2012-04-02 14:46:21 +0200"

235voto

Andrew France Points 1409

Avec les classes Date (et DateTime) vous pouvez faire (end_date - start_date).to_i pour obtenir le nombre de jours de différence.

0 votes

Oui, mais l'utilisateur a des chaînes de caractères et vous ne pouvez pas faire ça avec des chaînes de caractères. Vous en avez besoin en tant que dates. Voir ma réponse pour ajouter to_date à partir des extensions de base.

5 votes

@MichaelDurrant Vous faites une supposition injustifiée. L'utilisateur ne précise pas s'il s'agit de chaînes de caractères ou non. En fait, puisqu'il utilise Rails, il est très probable que les dates proviennent d'ActiveRecord, qui les convertit automatiquement en objets date. Le texte donné est également identique à la représentation de l'objet Date, ce qui rend très probable le fait qu'il provienne d'une source native.

1 votes

Correct, je suppose que l'utilisateur a essayé a - b et que cela n'a pas fonctionné et qu'il a fini par poster sur SO. Je suppose que seul andkjaer peut nous dire ce qu'il en est vraiment :)

130voto

lee Points 578

En supposant que end_date y start_date sont tous deux de classe ActiveSupport::TimeWithZone dans Rails, alors vous pouvez utiliser :

(end_date.to_date - start_date.to_date).to_i

3 votes

S'il s'agit de champs de tableau, cette réponse est la bonne, au lieu de la réponse la plus cotée ici.

1 votes

Ne fonctionne pas pour (Time.zone.now.to_date - 23.hours.ago.to_date).to_i il donne 1 et devrait être 0

4 votes

@YuriGhensev, cela dépend du moment où vous exécutez votre code d'exemple, par exemple maintenant Time.zone.now.to_date renvoie "Wed, 15 Nov 2017", alors que 23.hours.ago.to_date retourne "Tue, 14 Nov 2017". La différence en nombre de jours est et devrait être de 1, sauf si vous avez exécuté votre code dans l'heure précédant minuit.

38voto

Justin Herrick Points 1590

Rails possède des fonctions intégrées aides qui pourrait résoudre ce problème pour vous. Une chose à garder à l'esprit est que cela fait partie des aides d'Actionview, donc elles ne seront pas disponibles directement depuis la console.

Essayez ceci

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

0 votes

@MaayanNaveh il ne devrait pas l'être lorsque vous avez besoin du nombre réel pour les calculs.

0 votes

Cette question est l'un de ces cas où il vaut mieux poser la question elle-même différemment. Si vous suivez les autres réponses données ici, vous rencontrerez des cas où vous voudrez parfois afficher des semaines ou des années au lieu de jours. Ceci devrait être accepté comme la "bonne" réponse Rails.

35voto

thatdankent Points 471

J'ai obtenu des résultats en quelques secondes, donc ça a marché pour moi :

(Time.now - self.created_at) / 86400

1 votes

@Epigene 1.day n'est pas ruby comme l'a demandé le PO (dans les balises). C'est Rails ou plus spécifique active support bien que created_at est essentiellement un Model méthode dans Rails donc..

33voto

artmees Points 1776

Pour obtenir le nombre de jours dans un intervalle de temps (juste un 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

0 votes

Merci pour cela @a14m ! Cela m'a donné un moyen de faire des captures de dates inclusives et exclusives :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X