Ich habe diese jQuery
Funktion, die die aktuelle Zeit als Anzahl der Millisekunden seit der Epoche (1. Januar 1970) zurückgibt:
time = new Date().getTime();
Gibt es eine Möglichkeit, dies auch in Ruby zu tun?
Im Moment verwende ich Ruby's, Time.now.to_i
das hervorragend funktioniert, aber eine 10-stellige Ganzzahl (Anzahl der Sekunden) zurückgibt.
Wie kann ich die Anzahl der Millisekunden wie in anzeigen lassen jQuery
?
Antworten:
quelle
strftime
bereitgestellte MethodeActiveSupport::TimeWithZone
enthält nicht die Bezeichner%s
und%Q
. Sie müssenDateTime
zuerst mithilfe derto_datetime
Methode in einen einfachen Ruby konvertieren .Javascript
gettime()
gibt die Anzahl der Millisekunden seit der Epoche zurück.Ruby's
Time.now.to_i
gibt Ihnen die Anzahl der Sekunden seit der Epoche. Wenn Sie dies ändernTime.now.to_f
, erhalten Sie immer noch Sekunden, jedoch mit einer Bruchkomponente. Multiplizieren Sie das einfach mit 1.000 und Sie haben Millisekunden. Verwenden Sie dann#to_i
, um es in eine Ganzzahl zu konvertieren. Und am Ende haben Sie:quelle
Time.now
kommt von Ruby daTime.current
kommt von Rails. DiesTime.current
wird von der Rails-Anwendungszeitzone bestätigt undTime.now
verwendet die Serverzeitzone. Nach meiner Erfahrung verwenden Sie immerTime.current
auf Ihrer Rails-Anwendung für ZeitzonenkonsistenzTime.current
hier überhaupt nicht verwenden , das Erstellen dauert länger. Da Sie es sofort in einen Unix-Zeitstempel konvertieren, ist Ihnen die Zeitzonenkonsistenz überhaupt egal. (Unix-Zeitstempel beziehen sich immer auf UTC). Während das, was Sie sagen, in 99% der Fälle zutrifft, fällt dieses in Bezug auf die Leistung in die letzten 1%.:epoch
Methode hinzuzufügen : class Time def epoch (self.to_f * 1000) .to_i end end(Time.now.to_f * 1000).to_i
sollte das gleiche tun.quelle
to_f
Millisekunden als Dezimalzahl enthalten sind.Mit
strftime
können Sie die Anzahl der Sekunden ermitteln und Millisekunden (oder bei Bedarf kleinere Einheiten) anhängen:Beachten Sie jedoch, dass dies nicht rund ist, sondern abgeschnitten wird, wie Sie sehen können
to_f
oder wenn Sie auf Mikrosekunden gehen:und die
to_f
/to_i
Lösung hat das gleiche Problem:Wenn Sie also wirklich um Millisekunden Genauigkeit sorgen, eine bessere Wette sein kann
to_f
mitround
:Wie in den Dokumenten erwähnt , ist "IEEE 754 double nicht genau genug, um die Anzahl der Nanosekunden seit der Epoche darzustellen". Wenn Sie sich also wirklich wirklich darum kümmern, sollten Sie
to_r
stattto_f
-- obwohl es Ihnen wahrscheinlich gut geht, wenn Sie nur auf Millisekunden runden.
quelle
Sei vorsichtig, sei nicht verwirrt. Die Tatsache, dass Ruby die Idee von Sekundenbruchteilen als Gleitkomma unterstützt, macht es nicht zu einer Gleitkommazahl. Ich hatte Probleme damit, als ich Wireshark-Zeitstempel-Zeitvergleiche in Python durchführte ... die Zeitberechnungen im pcap-ng funktionierten einfach nicht. Erst als ich die beiden Teile (integrale Sekunden und integrale Nanosekunden) als beide ganzen Zahlen behandelte, konnte ich die richtigen Zahlen erhalten.
Dies liegt daran, dass Gleitkommazahlen Genauigkeitsprobleme haben . In der Tat zeigt Ihnen ein kurzes Stück Ruby, dass to_f nicht gleich nsec ist:
Vorsichtsmaßnahme Programmierer. Sie können bis zu 3 signifikanten Stellen sicher sein, aber die Tatsache bleibt: Gleitkommazahlen auf Computern sind Näherungswerte. Die Nanosekundenzähler auf modernen Computern sind ganze Zahlen.
quelle
.strftime("%9N")
kann ebenfalls verwendet werden. ruby-doc.org/core-2.3.1/Time.html#method-i-strftimeWenn Sie ein Time- Objekt mit abrufen
Time.now
, wird beim Aufrufen#to_i
ein Unix-Zeitstempel (Sekunden ab Epoche) zurückgegeben.#to_f
gibt Sekundenbruchteile an, mit denen Sie Millisekunden aus der Epoche abrufen können:quelle
Die typisierte Ganzzahl (1e6 * Time.now.to_f) gibt ein Bignum zurück, das die Millisekunden aufnehmen kann
quelle