2010-11-14 24 views
13

sólo estoy echando un vistazo a rubí y estaba jugando con la cosa de fecha/hora.fechas resta con Rubí

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 

Así que mi ejemplo no es tan bueno como age_in_years no sabrá si hay años bisiestos como aquellos años se suman. He pasado por algunos tutoriales de hora/fecha en Google y no he encontrado una manera fácil de simplemente restar dos fechas y tienen que volver en un año, mes, día, etc ... formato. supongo Ruby tiene un add-on o algo incorporado para este tipo de cosas. ¿Podría alguien decirme qué es? (También, algún consejo de cómo encontrar las respuestas a este tipo de cosas para futuras referencias?)

Gracias.

Respuesta

29

¿Quieres Date en lugar 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 

le dará la diferencia en años entre hoy y el 1 de enero de 2000. Probablemente se puede mejorar, acabo de utilizar el número medio de días al año (365,25), que le dará la respuesta correcta, excepto en casos extremos.

También puede hacer algo como esto:

require 'date' 

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

Pero Date#next_year se introdujo en Ruby 1.9, por lo que no funcionaría en 1.8.7.

Por supuesto, la forma más fácil de determinar el número de años entre dos fechas es simplemente restando los números:

2010 - 2000 # => 10 
+0

Gracias Theo :) Su tercera sugerencia inspirado que haga ... requieren ' fecha' date_now = Date.today DOB = Date.civil (2003, 10, 22) si date_now.month> dob.month edad = date_now.year - dob.year elsif date_now.month == dob .month && date_now.day> dob.day edad = date_now.year - dob.year demás edad = (date_now.year - dob.year) - 1 final final de impresión "edad correcta es:", la edad, "\ n" I realmente no podía entender su segunda sugerencia y parece que no puede ejecutar 1.9 para jugar con ella. – Leke

+0

Sí, tienes razón, el último ejemplo también tiene que tener en cuenta el mes y el día, por supuesto. El ejemplo del medio simplemente da un paso por un año por cada vuelta en el ciclo y cuenta los giros. Lo he cambiado para ser un poco más correcto. – Theo

+2

me estaba bastante confundido acerca de por qué Rubí siempre regresaba un '/ 1' después de la fecha de mi sustracciones, era importante hacer un' to_i' en el resultado como se mencionó anteriormente para obtener el valor como un número de días. – waffl