2010-11-14 5 views
13

Je viens de jeter un oeil à ruby ​​et jouait avec la chose date/heure.En soustrayant dates avec Ruby

irb(main):001:0> jamis_DOB = Time.mktime(2003, 10, 22, 06, 59) 
=> Wed Oct 22 06:59:00 +0300 2003 
irb(main):002:0> age = Time.now - jamis_DOB 
=> 222934108.172989 
irb(main):005:0> age_in_years = (((age/3600)/24)/365).to_i 
=> 7 

Donc, mon exemple est pas si bon que age_in_years ne sais pas s'il y a des années bissextiles que ces années additionnent. J'ai suivi des tutoriels googled time/date et je n'ai pas trouvé un moyen facile de soustraire deux dates et de les faire revenir dans un format d'années, de mois, de jours, etc. Je devine que ruby ​​a un add-on ou quelque chose de intégré pour ce genre de chose. Quelqu'un pourrait-il me dire ce que c'est? (Aussi, des conseils comment trouver les réponses à ce genre de chose pour référence future?)

Merci.

Répondre

29

Vous voulez Date au lieu de Time:

require 'date' 

now = Date.today 
before = Date.civil(2000, 1, 1) 
difference_in_days = (now - before).to_i 

(difference_in_days/365.25).to_i 

vous donnera la différence au cours des années entre aujourd'hui et le 1er Janvier 2000. Il peut sans doute être améliorée, je viens d'utiliser le nombre moyen de jours par an (365,25), qui vous donnera la bonne réponse sauf dans les cas extrêmes.

Vous pouvez aussi faire quelque chose comme ceci:

require 'date' 

years = 0 
d = Date.civil(2000, 1, 1) 
loop do 
    d = d.next_year 
    break if Date.today < d 
    years += 1 
end 

Mais Date#next_year a été introduit en Ruby 1.9, donc il ne fonctionnerait pas en 1.8.7.

Bien sûr, la meilleure façon de déterminer le nombre d'années entre deux dates est juste en soustrayant les chiffres:

2010 - 2000 # => 10 
+0

Merci :) Theo Votre suggestion 3 m'a inspiré à faire ... require ' Date » date_now = Date.today DOB = Date.civil (2003, 10, 22) si date_now.month> dob.month age = date_now.year - dob.year ELSIF date_now.month == DOB .month && date_now.day> dob.day age = date_now.year - dob.year autre age = (date_now.year - dob.year) - 1 fin fin print "âge correct est:", l'âge, "\ n" I Je n'arrive pas à comprendre votre deuxième suggestion et je n'arrive pas à la faire fonctionner en même temps. – Leke

+0

Oui, vous avez raison, le dernier exemple doit prendre en compte le mois et le jour, bien sûr. L'exemple du milieu fait juste un an pour chaque tour de la boucle et compte les tours. Je l'ai changé pour être un peu plus correct. – Theo

+2

Je commençais à me demander pourquoi Ruby retournait toujours un '/ 1' après mes soustractions de date, était important de faire un' to_i' sur le résultat comme mentionné ci-dessus pour obtenir la valeur en nombre de jours. – waffl