2009-09-12 6 views
78

Si j'ai un objet Time a obtenu de:Comment obtenir le temps écoulé en millisecondes dans Ruby?

Time.now 

et plus tard, j'instancier un autre objet avec cette même ligne, comment puis-je voir combien de millisecondes sont passés? Le deuxième objet peut être créé à la même minute, au cours des minutes ou des heures suivantes.

Répondre

113

Comme l'a déjà dit, vous pouvez utiliser sur Time objets comme si elles étaient numérique (ou à virgule flottante) valeurs. Ces opérations résultent en une deuxième résolution qui peut facilement être convertie.

Par exemple:

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 

Vous devrez décider de tronquer ou non.

+2

Ajoutez un to_i et vous l'avez en entier, par exemple: ((finish - start) * 1000.0) .to_i –

+0

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

+1

'finish - start' donne un point flottant; '.to_f' serait redondant. – ezpz

3

Essayez de soustraire le premier Time.now de la seconde. Comme si:

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

Cela vous donne un nombre à virgule flottante des secondes entre les deux fois (et avec cela, les millisecondes).

6

Time.now.to_f peut vous aider, mais il renvoie secondes.

En général, lorsque l'on travaille avec des critères I:

  • mis dans la variable le temps en cours;
  • insérer le bloc à tester;
  • mettre dans une variable l'heure actuelle, en soustrayant la valeur actuelle-temps précédente;

C'est un processus très simple, donc je ne suis pas sûr que vous demandiez vraiment ce ...

9

La réponse d'ezpz est presque parfaite, mais j'espère pouvoir en ajouter un peu plus.

Geo a demandé l'heure en millisecondes; cela ressemble à une quantité entière, et je ne prendrais pas le détour à travers la terre à virgule flottante. Ainsi, mon approche serait:

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 

Multipliant par un entier 1000 conserve le nombre fractionnaire parfaitement et peut être un peu plus rapide aussi. Si vous traitez des dates et des heures, vous devrez peut-être utiliser la classe DateTime. Cela fonctionne de manière similaire mais le facteur de conversion est 24 * 3600 * 1000 = .

J'ai trouvé strptime et strftime DateTime fonctions inestimables dans parsing et de formatage des chaînes de date/heure (par exemple à/de journaux). Ce qui est pratique à savoir, c'est:

  • Les caractères de formatage pour ces fonctions (% H,% M,% S, ...) sont presque les mêmes que pour les fonctions C trouvées sur n'importe quel système Unix/Linux; et

  • Il y en a quelques autres: En particulier, % L fait des millisecondes!

+0

Bon à savoir! Merci 'unknown' :) – Geo

+1

Quoi qu'il en soit% L n'existe que dans Ruby 1.9;) –

55

Vous pouvez ajouter un peu de sucre de syntaxe à la solution ci-dessus avec les éléments suivants:

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

L'extension de la classe Time semble la plus propre, merci! –

24

Je pense que la réponse est mal choisie, cette méthode donne secondes, pas millisecondes.

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

Ici, je suppose que la valeur flottante sont les millisecondes

+0

La réponse choisie est correcte. Utiliser l'addition ou la soustraction sur 'Time.now' traite le temps comme des valeurs à virgule flottante avec des secondes avant la virgule décimale et jusqu'à nanosecondes après la virgule décimale (bien que nsec puisse ne pas être complètement exact). Donc multiplier cette valeur par '1000.0 'donne des millisecondes. – dfherr

7

Pour obtenir plus de temps en millisecondes, il est préférable d'ajouter .round(3), il sera plus précis dans certains cas:

puts Time.now.to_f # => 1453402722.577573 

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

%L donne des millisecondes en rubis

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

ou

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

vous donnera l'horodatage actuel en millisecondes.

+0

Cela ne dit pas comment obtenir le temps écoulé. – Robert

Questions connexes