2009-09-12 19 views

Respuesta

113

Como se ha dicho ya, usted puede operar en Time objetos como si fueran numérico (o punto flotante) valores. Estas operaciones dan como resultado una segunda resolución que se puede convertir fácilmente.

Por ejemplo:

def time_diff_milli(start, finish) 
    (finish - start) * 1000.0 
end 

t1 = Time.now 
# arbitrary elapsed time 
t2 = Time.now 

msecs = time_diff_milli t1, t2 

Usted tendrá que decidir si para truncar o no.

+2

agregue un to_i y lo tiene como un entero, por ejemplo: ((finish - start) * 1000.0) .to_i –

+0

'finish.to_f - start.to_f'? – bodacious

+1

'finish - start' cede el punto flotante; '.to_f' sería redundante. – ezpz

3

Intenta restar el primer Time.now del segundo. De este modo:

a = Time.now 
sleep(3) 
puts Time.now - a # about 3.0 

Esto le da un número de coma flotante de los segundos entre los dos tiempos (y con ello, los milisegundos).

6

Time.now.to_f puede ayudarle, pero devuelve segundos.

En general, cuando se trabaja con puntos de referencia I:

  • poner en la variable de la hora actual;
  • inserte el bloque para probar;
  • poner en una variable la hora actual, restando el valor anterior de tiempo actual;

Es un proceso muy simple, así que no estoy seguro de que realmente estaban haciendo esta ...

9

La respuesta de ezpz es casi perfecta, pero espero poder agregar un poco más.

Geo preguntó por el tiempo en milisegundos; esto suena como una cantidad entera, y no tomaría el desvío a través de tierra flotante. Por tanto, mi enfoque sería:

irb(main):038:0> t8 = Time.now 
=> Sun Nov 01 15:18:04 +0100 2009 
irb(main):039:0> t9 = Time.now 
=> Sun Nov 01 15:18:18 +0100 2009 
irb(main):040:0> dif = t9 - t8 
=> 13.940166 
irb(main):041:0> (1000 * dif).to_i 
=> 13940 

Multiplicando por un número entero 1000 conserva el número fraccionario perfectamente y puede ser un poco más rápido.

Si tiene fechas y horas, puede necesitar utilizar la clase DateTime. Esto funciona de manera similar, pero el factor de conversión es 24 * 3600 * 1000 = .

que he encontrado de DateTime strptime y strftime funciones de valor incalculable en las cadenas de fecha/hora de análisis y de formato (por ejemplo a/desde logs). Lo que es muy útil saber es:

  • Los caracteres de formato para estas funciones (% H,% M,% S, ...) son casi los mismos que para las funciones C encontradas en cualquier sistema Unix/Linux; y

  • Hay algunos más: en particular, % L hace milisegundos!

+0

¡Es bueno saberlo! Gracias 'unknown' :) – Geo

+1

De todos modos% L existe solo en Ruby 1.9;) –

55

Se puede añadir un poco de azúcar sintaxis a la solución anterior con lo siguiente:

class Time 
    def to_ms 
    (self.to_f * 1000.0).to_i 
    end 
end 

start_time = Time.now 
sleep(3) 
end_time = Time.now 
elapsed_time = end_time.to_ms - start_time.to_ms # => 3004 
+1

Extendiendo la clase Time se ve más limpio, gracias! –

24

Creo que la respuesta se elige de forma incorrecta, que el método da segundos, no en milisegundos.

t = Time.now.t­o_f 
=> 1382471965.146 

Aquí supongo que el valor flotante son los milisegundos

+0

La respuesta elegida es correcta. Usar suma o resta en 'Time.now' es tratar el tiempo como valores de coma flotante con segundos antes del punto decimal y hasta nanosegundos después del punto decimal (aunque nsec puede no ser completamente exacto). Entonces multiplicar ese valor por '1000.0' rinde milisegundos. – dfherr

7

para obtener el tiempo en milisegundos, es mejor agregar .round(3), por lo que será más preciso en algunos casos:

puts Time.now.to_f # => 1453402722.577573 

(Time.now.to_f.round(3)*1000).to_i # => 1453402722578 
2

%L da milisegundos en ruby ​​

require 'time' 
puts Time.now.strftime("%Y-%m-%dT%H:%M:%S.%L") 

o

puts Time.now.strftime("%Y-%m-%d %H:%M:%S.%L") 

le dará la marca de tiempo actual en milisegundos.

+0

Esto no dice cómo obtener el tiempo transcurrido. – Robert

Cuestiones relacionadas