2010-06-16 13 views
34

Tengo la sensación de que alguien me señalará otra pregunta que responde a esto, pero he estado buscando sin suerte sobre este simple problema.Calcular la diferencia en días ActiveSupport: TimeWithZone en el estilo más "ruby"?

Tengo un Activerecord con una propiedad datetime. Vuelve como un ActiveSupport: TimeWithZone. Sé que no puedo comparar eso con DateTime.now porque eso no incluye una zona, así que necesito usar Time.zone. Tiene sentido.

Lo que me pregunto es ¿hay una manera "más limpia" de hacer esto que restar y dividir el resultado entre 86400?

Aquí es lo que hago:

((Time.zone.now - myActiveRecord.visit_date)/86400).to_i 

funciona, pero parece un-rubyish y siento que me falta algo. ¿Debería lanzar, comparar o convertir alguna otra ruta o esta es realmente la forma típica de hacerlo en rieles? Aprecie cualquier consejo o enlace a una pregunta que ya lo cubra.

Gracias

+0

¿Quieres palabras de salida cuando todo está dicho y hecho? – theIV

+0

Estoy limitado a hacer esto en un modelo en el momemnt, así que no puedo aprovechar las ayudantes de time_ago_in_words. Solo estoy recuperando el valor int de una aplicación cliente. Gracias a todos por la retroalimentación. – Nick

Respuesta

73

Una cosa que puede hacer para que sea más fácil de leer es:

((Time.zone.now - myActiveRecord.visit_date)/1.day).to_i 

Editar:

En realidad, usted puede deshacerse de un conjunto de los soportes con:

(Time.zone.now - myActiveRecord.visit_date).to_i/1.day 
+0

En realidad, hay un método para esto que menciono a continuación. – jamesconant

+0

'' (Time.zone.now - 3.days.ago) .to_i/1.day'' arrojará '' 2'' – dgilperez

+1

Esto no siempre funciona. Tuve que hacer en su lugar: '(myActiveRecord.end_date.to_datetime.to_i - Time.now.to_i)/1.day' –

14

Sé que esta pregunta está un poco anticuada, pero me encontré con ella mientras buscaba en Google problema. En mi caso, necesitaba saber la diferencia en días enteros a escala macro y micro.

Por ejemplo, necesitaba mi código para poder decirme que el 31 de diciembre de 2010 es 366 días antes del 1 de enero de 2012 y que el 31 de diciembre de 2010 23:59 está a 1 día del 1 de enero de 2011 00: 00. El método anterior funciona en el primero, pero en el caso del último, dice que tienen 0 días de diferencia.

Lo que terminé haciendo fue utilizar la clase Date de Ruby para hacer los cálculos por mí. Usando el código anterior mi método es el siguiente:

(Time.zone.now.to_date - myActiveRecord.visit_date.to_date).to_i

Esto funciona con entradas en TimeDateTime o debido a la conversión. Otra posible solución sería llamar primero al beginning_of_day en cada uno de los Times o DateTimes, pero en mi caso, los minutos eran importantes.

-1

Rails en realidad tiene un método incorporado para este tipo de cosas.

la caja #time_ago_in_words

Así, para el caso original ...

((Time.zone.now - myActiveRecord.visit_date)/86400).to_i

vs

time_ago_in_words(myActiveRecord.visit_date)

+0

En realidad, ese método devuelve una descripción de cadena legible para el ser humano, no la diferencia numérica real. –

+0

Vaya, buena captura. – jamesconant

Cuestiones relacionadas