J'ai cette fonction jQuery
qui renvoie l'heure actuelle sous forme de millisecondes depuis l'époque (le 1er janvier 1970):
time = new Date().getTime();
Y at-il un moyen de faire la même chose dans Ruby?
En ce moment, j'utilise Ruby Time.now.to_i
qui fonctionne très bien mais renvoie un 10 chiffres entier (nombre de secondes)
Comment puis-je l'obtenir pour afficher le nombre de millisecondes, comme dans jQuery
?
require 'date'
p DateTime.now.strftime('%s') # "1384526946" (seconds)
p DateTime.now.strftime('%Q') # "1384526946523" (milliseconds)
La gettime()
de Javascript renvoie le nombre de millisecondes depuis Epoch.
Ruby Time.now.to_i
vous donnera le nombre de secondes depuis Epoch. Si vous changez cela en Time.now.to_f
, vous obtenez toujours des secondes mais avec un composant fractionnaire. Il suffit de multiplier cela par 1 000 et vous avez millisecondes. Ensuite, utilisez #to_i
pour le convertir en entier. Et vous vous retrouvez avec:
(Time.now.to_f * 1000).to_i
(Time.now.to_f * 1000).to_i
devrait faire la même chose.
Soyez prudent, ne vous trompez pas. Le fait que Ruby soutienne l’idée de secondes décimales comme un flottant n’en fait pas un nombre à virgule flottante. J'ai eu des problèmes avec cela lorsque je faisais des comparaisons d'horodatage Wireshark en Python ... les calculs de temps dans le pcap-ng ne fonctionnaient tout simplement pas. Ce n'est que lorsque j'ai traité les deux parties (secondes intégrales et nanosecondes intégrales) que les deux entiers ont été en mesure d'obtenir les nombres appropriés.
C'est parce que les nombres en virgule flottante ont Problèmes de précision . En effet, un petit peu de Ruby vous montrera que to_f n’est pas égal, disons, à nsec:
irb(main):019:0> t=Time.now
=> 2015-04-10 16:41:35 -0500
irb(main):020:0> puts "#{t.to_f}; #{t.nsec}"
1428702095.1435847; 143584844
Caveat Programmer. Vous pouvez être sûr à 3 chiffres significatifs, mais le fait demeure: Les nombres en virgule flottante sur les ordinateurs sont des approximations. Les compteurs nanosecondes sur les ordinateurs modernes sont des entiers.
Obtenir un Heure objet avec Time.now
, appeler #to_i
renvoie un horodatage Unix (secondes à partir de l'époque). #to_f
donne des fractions de secondes que vous pouvez utiliser pour obtenir des millisecondes à partir d'Epoch:
Time.now.to_f * 1000
La conversion de type Integer (1e6 * Time.now.to_f) renvoie un Bignum pouvant contenir les millisecondes.