web-dev-qa-db-fra.com

Comment obtenir l'heure actuelle sous forme de nombre entier à 13 chiffres en Ruby?

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?

71
Tintin81
require 'date'

p DateTime.now.strftime('%s') # "1384526946" (seconds)
p DateTime.now.strftime('%Q') # "1384526946523" (milliseconds)
124
steenslag

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
88
Anthony DeSimone

(Time.now.to_f * 1000).to_i devrait faire la même chose.

23
Zach Kemp

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.

14
Mike S

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
13
levinalex

La conversion de type Integer (1e6 * Time.now.to_f) renvoie un Bignum pouvant contenir les millisecondes.

0
chava