2010-03-04 11 views
7

Me preguntaba si hay un método incorporado en Ruby que me permita convertir tiempos de vuelta en el formato de hh: mm: ss. sss a milisegundos y viceversa. Como necesito hacer algunos cálculos con él, asumí que la conversión a milisegundos sería la forma más fácil de hacerlo. Dígame si me equivoco aquí :)Convertir duraciones en Ruby - hh: mm: ss.sss a milisegundos y viceversa

+0

Qué cálculos que tiene que hacer? La clase Ruby 'DateTime' es bastante útil para la mayoría de los tipos de cálculos. –

+0

Sumar y restar en general. Además de esto, estos tiempos están ligados a una cierta intensidad, por ejemplo: "02: 25.700 a una intensidad del 70%". Basado en este tiempo, necesitaría calcular el tiempo teórico al 100% de intensidad. En aras de la exhaustividad: estos tiempos no están limitados a una fecha determinada. – herrherr

Respuesta

8

¿Qué tal esto?

a=[1, 1000, 60000, 3600000]*2 
ms="01:45:36.180".split(/[:\.]/).map{|time| time.to_i*a.pop}.inject(&:+) 
# => 6336180 
t = "%02d" % (ms/a[3]).to_s << ":" << 
    "%02d" % (ms % a[3]/a[2]).to_s << ":" << 
    "%02d" % (ms % a[2]/a[1]).to_s << "." << 
    "%03d" % (ms % a[1]).to_s 
# => "01:45:36.180" 
+0

Me tomó bastante tiempo entenderlo completamente, pero funciona como un encanto :) Gracias por eso. – herrherr

+1

Lo siento, debería poner algunos comentarios allí en vez de codificar el golf. –

+0

¡Gracias, esto funciona bien! – jspooner

3

Como ignora la fecha en su totalidad, y posiblemente tenga números mayores a 24 como número de horas, tal vez las clases de Ruby existentes no sean adecuadas para usted (al menos las del estándar) lib).

En realidad, hay dos métodos que pueden ser útiles: time_to_day_fraction y day_fraction_to_time, pero por alguna razón son privados (al menos en 1.9.1).

Así que puedes mono-parchearlas hacerlos públicos, o simplemente copiar y pegar su aplicación a su código:

def time_to_day_fraction(h, min, s) 
    Rational(h * 3600 + min * 60 + s, 86400) # 4p 
end 

def day_fraction_to_time(fr) 
    ss, fr = fr.divmod(Rational(1, 86400)) # 4p 
    h, ss = ss.divmod(3600) 
    min, s = ss.divmod(60) 
    return h, min, s, fr 
end 

Están trabajando con Rational clase, por lo que se puede calcular fácilmente con ellos.

+0

Si agrego los milisegundos, esto debería funcionar. Lo probaré más tarde. Gracias :) – herrherr

+0

Ya funciona con los milisegundos, solo pasas segundos como Float o Rational ('time_to_day_fraction (1,45,22.345)'). –

+0

No funciona con un flotador, obtengo "un método indefinido' gcd '". – herrherr

Cuestiones relacionadas