2010-03-04 7 views
7

Je me demandais s'il existait une méthode intégrée dans Ruby qui me permet de convertir des temps au format hh: mm: ss. sss à millisecondes et vice versa. Étant donné que j'ai besoin de faire quelques calculs, j'ai supposé que la conversion en millisecondes serait le moyen le plus facile de le faire. Dites-moi si je me trompe ici :)Convertir des durées en Ruby - hh: mm: ss.sss en millisecondes et vice versa

+0

Quels sont les calculs que vous devez faire? La classe Ruby 'DateTime' est très pratique pour la plupart des types de calculs. –

+0

Ajouter et soustraire en général. En plus de cela, ces temps sont liés à une certaine intensité, par exemple: "02: 25.700 à 70% d'intensité". En fonction de ce temps, je devrais calculer le temps théorique à 100% d'intensité. Par souci d'exhaustivité: ces délais ne sont pas liés à une certaine date. – herrherr

Répondre

8

Que pensez-vous de cela?

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

Il m'a fallu beaucoup de temps pour le comprendre pleinement, mais fonctionne comme un charme :) Merci pour cela. – herrherr

+1

Désolé, je devrais mettre quelques commentaires là-bas au lieu de jouer au golf. –

+0

Merci cela fonctionne bien! – jspooner

3

Comme vous ignorez complètement la date et si vous avez des nombres supérieurs à 24 en nombre d'heures, peut-être que les classes Ruby existantes ne vous conviennent pas (du moins celles de la norme lib).

En fait, il existe quelques méthodes qui pourraient être utiles: time_to_day_fraction et day_fraction_to_time, mais pour une raison quelconque, elles sont privées (au moins dans 1.9.1).

Vous pouvez soit les singes-patch pour les rendre publics, ou tout simplement copier-coller leur application à votre code:

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 

Ils travaillent avec Rational classe, de sorte que vous pouvez calculer facilement avec eux.

+0

Si j'ajoute les millisecondes, cela devrait fonctionner. Je vais essayer ça plus tard. Merci :) – herrherr

+0

Cela fonctionne déjà avec les millisecondes, il vous suffit de passer des secondes comme Float ou Rational ('time_to_day_fraction (1,45,22.345)'). –

+0

Ne fonctionne pas avec un flotteur, j'obtiens "une méthode non définie' gcd '". – herrherr

Questions connexes