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.
hay un método hecho para eso:
Time.now.minus_with_coercion(10.seconds.ago)
es igual a 10.
Fuente: http://apidock.com/rails/Time/minus_with_coercion
Espero que haya ayudado.