ruby-on-rails datetime

ruby-on-rails - datetime ruby



¿Cómo obtengo el número de segundos entre dos DateTimes en Ruby on Rails? (8)

¿por qué no utilizar el "sec" incorporado? Aquí hay un ejemplo :

t1 = Time.now.sec elapsed_t = Time.now.sec - t1 puts "it took me : #{elapsed_t} seconds to do something that is useful /n"

Tengo un código que hace un seguimiento del tiempo para los empleados. Crea un contador para mostrarle al empleado cuánto tiempo hace que se registraron.

Este es el código actual:

start_time = Time.parse(self.settings.first_clock_in) total_seconds = Time.now - start_time hours = (total_seconds/ 3600).to_i minutes = ((total_seconds % 3600) / 60).to_i seconds = ((total_seconds % 3600) % 60).to_i

Esto funciona bien Pero como Time está limitado al rango de 1970-2038, estamos intentando reemplazar todos los usos de Time con DateTimes. No puedo descifrar cómo obtener la cantidad de segundos entre dos DateTimes. Restarlos produce un Rational que no sé cómo interpretar, mientras que restar Times produce la diferencia en segundos.


Al restar dos DateTimes, se devuelve el tiempo transcurrido en días, por lo que puede hacer:

elapsed_seconds = ((end_time - start_time) * 24 * 60 * 60).to_i


Defina una función de Ruby como esta,

def time_diff(start_time, end_time) seconds_diff = (start_time - end_time).to_i.abs days = seconds_diff / 86400 seconds_diff -= days * 86400 hours = seconds_diff / 3600 seconds_diff -= hours * 3600 minutes = seconds_diff / 60 seconds_diff -= minutes * 60 seconds = seconds_diff "#{days} Days #{hours} Hrs #{minutes} Min #{seconds} Sec" end

Y llame a esta función,

time_diff(Time.now, Time.now-4.days-2.hours-1.minutes-53.seconds)


Estoy usando ruby-2.1.4 y para mí lo siguiente funcionó

Time.now - Time.new(2014,11,05,17,30,0)

me dio la diferencia de tiempo en segundos

referencia: ruby doc


O, más legible:

diff = datetime_1 - datetime_2 diff * 1.days # => difference in seconds; requires Ruby on Rails

Tenga en cuenta que lo que usted u otros buscadores podrían estar buscando es esto:

diff = datetime_1 - datetime_2 Date.day_fraction_to_time(diff) # => [h, m, s, frac_s]


Otros confían incorrectamente en fracciones o funciones auxiliares. Es mucho más simple que eso. DateTime en sí mismo es un número entero debajo. Esta es la manera de Ruby:

stop.to_i - start.to_i

Ejemplo:

start = Time.now => 2016-06-21 14:55:36 -0700 stop = start + 5.seconds => 2016-06-21 14:55:41 -0700 stop.to_i - start.to_i => 5


Puede convertirlos en flotantes con to_f , aunque esto provocará la pérdida habitual de precisión asociada con los flotadores. Si solo estás transfiriendo a un entero por segundos enteros, no debería ser lo suficientemente grande como para ser una preocupación.

Los resultados están en segundos:

>> end_time.to_f - start_time.to_f => 7.39954495429993 >> (end_time.to_f - start_time.to_f).to_i => 7

De lo contrario, podrías mirar usando to_formatted_s en el objeto DateTime y ver si puedes convertir el resultado en algo que la clase Decimal aceptará, o simplemente formatearlo como un simple tiempo de Unix como una cadena y llamar a to_i sobre eso.