2012-10-30 11 views
58

Ho questa funzione jQuery che restituisce l'ora corrente come il numero di millisecondi dall'epoca (1 Gennaio 1970):Come ottenere l'ora corrente come numero intero a 13 cifre in Ruby?

time = new Date().getTime(); 

C'è un modo per fare la stessa cosa in Ruby?

In questo momento, sto usando di Ruby Time.now.to_i che funziona alla grande, ma restituisce un 10 cifre intero (numero di secondi)

Come posso ottenere che per visualizzare il numero di millisecondi, come in jQuery?

+4

che non è una "funzione di jQuery", è semplicemente ECMAScript (JavaScript). Forse è quello che ha spinto il -1, un po 'severo. – RobG

+0

Vedere anche http://stackoverflow.com/q/20001883/238886 –

risposta

22

(Time.now.to_f * 1000).to_i dovrebbe fare la stessa cosa.

+1

questo fake i millisecondi – brauliobo

73

Javascript gettime() restituisce il numero di millisecondi dall'epoca.

Ruby's Time.now.to_i ti darà il numero di secondi dall'epoca. Se lo cambi a Time.now.to_f, ottieni comunque secondi ma con un componente frazionario. Basta moltiplicarlo per 1.000 e hai millisecondi. Quindi utilizzare #to_i per convertirlo in un numero intero. E si finisce con:

(Time.now.to_f * 1000).to_i 
+0

Grazie mille per la spiegazione! Ancora nuovo a questa cosa ... Non so quale risposta sia quella corretta ... – Tintin81

+0

Solo per ulteriori informazioni, 'Time.now' proviene da Ruby dato che' Time.current' proviene da Rails. Quindi 'Time.current' è riconosciuto dal fuso orario dell'applicazione Rails e' Time.now' sta usando il fuso orario del server. Nella mia esperienza, usa sempre 'Time.current' sull'applicazione Rails per la consistenza del fuso orario – vutran

+0

No, non dovresti usare' Time.current' qui, richiede più tempo per costruirlo e dato che lo stai convertendo immediatamente in un unix timestamp, non ti interessa affatto la coerenza del fuso orario. (I timestamp Unix si riferiscono sempre all'UTC). Quindi, mentre quello che dici è vero nel 99% dei casi, questo calo delle prestazioni è nell'ultimo 1%. –

13

ottenere un oggetto Time con Time.now, chiamando #to_i restituisce un timestamp Unix (secondi da epoca). #to_f dà frazioni di secondo che è possibile utilizzare per ottenere millisecondi dalla epoca:

Time.now.to_f * 1000 
+0

questo fa falsi i millisecondi – brauliobo

100
require 'date' 

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

Nota per gli utenti di Rails: il metodo 'strftime' fornito da' ActiveSupport :: TimeWithZone' non include gli specificatori '% s' e'% Q'. Dovrai prima convertire in un semplice DateTime di Ruby, usando il metodo 'to_datetime'. –

+3

@LonnonFoster Ora funziona (appena testato nella console di Rails). – Nikola

+0

Ciao, come posso fare la stessa cosa, ma non per ora, ma piuttosto da un campo data? – Tomer

13

Attenzione, non confondersi. Il fatto che Ruby supporti l'idea di secondi frazionari come un float in realtà non ne fa un numero in virgola mobile. Mi sono messo nei guai con questo quando stavo facendo dei confronti temporali con il timestamp di Wireshark in Python ... i calcoli temporali nel pcap-ng non funzionavano. È stato solo quando ho trattato le due parti (secondi interi e nanosecondi interi) che entrambi i numeri erano in grado di ottenere numeri adeguati.

Ecco perché i numeri in virgola mobile hanno Accuracy problems. In effetti, un po 'veloce di Rubino vi mostrerà che to_f non è uguale, per esempio, 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 programmatore. Potresti essere sicuro di 3 cifre significative, ma il fatto rimane: i numeri in virgola mobile sui computer sono approssimazioni. I contatori a nanosecondi sui computer moderni sono numeri interi.

+0

La risposta migliore. Grazie. Anche il formato direttiva '' '.strftime ("% 9N ")' '' può essere usato. http://ruby-doc.org/core-2.3.1/Time.html#method-i-strftime – rplaurindo

8

Utilizzando strftime, è possibile ottenere il numero di secondi e aggiungere millisecondi frazionari (o unità più piccole, se necessario):

2.2.2 :001 > t = Time.new 
=> 2015-06-02 12:16:56 -0700 
2.2.2 :002 > t.strftime('%s%3N') 
=> "1433272616888" 

Nota però che questo non rotonda, si tronca, come si può vedere con to_f o se si va fuori a microsecondi:

2.2.2 :003 > t.to_f 
=> 1433272616.888615 
2.2.2 :004 > t.usec 
=> 888615 

e la soluzione to_f/to_i ha lo stesso problema:

2.2.2 :009 > (t.to_f * 1000).to_i 
=> 1433272616888 

quindi se davvero a cuore la precisione millisecondo, una scommessa migliore potrebbe essere to_f con round:

2.2.2 :010 > (t.to_f * 1000).round 
=> 1433272616889 

Detto questo, come noted in the docs, "IEEE 754 doppio non è sufficientemente accurata per rappresentare il numero di nanosecondi dal momento che l'epoca", quindi se davvero veramente cura, considera to_r invece di to_f -

2.2.2 :011 > (t.to_r * 1000).round 
=> 1433272616889 

- anche se stai arrotondando solo di pochi millisecondi probabilmente stai bene.

0

Il typecast Integer (1E6 * Time.now.to_f) restituisce un bignum che può contenere i millisecondi

Problemi correlati