2012-10-30 5 views
58

mam ten jQuery funkcję, która zwraca bieżący czas jako liczbę milisekund od epoki (Jan 1, 1970):Jak uzyskać aktualny czas w postaci 13-cyfrowej liczby całkowitej w Ruby?

time = new Date().getTime(); 

Czy istnieje sposób, aby zrobić to samo w Ruby?

Teraz używam Ruby Time.now.to_i który działa świetnie, ale zwraca 10-cyfrowy numer Integer (liczba sekund)

Jak mogę zmusić go, aby wyświetlić liczbę milisekund, tak jak w jQuery?

+4

To nie jest "funkcją jQuery", to po prostu zwykły ECMAScript (JavaScript). Być może właśnie to spowodowało -1, ale ciężko. – RobG

+0

Zobacz także http://stackoverflow.com/q/20001883/238886 –

Odpowiedz

22

(Time.now.to_f * 1000).to_i powinien zrobić to samo.

+1

to podróbki milliseconds – brauliobo

73

Javascript w gettime() Zwraca liczbę milisekund od epoki.

Ruby Time.now.to_i daje liczbę sekund od epoki. Jeśli zmienisz to na Time.now.to_f, nadal otrzymasz sekundy, ale z ułamkową składową. Po prostu pomnóż to przez 1000 i masz milisekundy. Następnie użyj #to_i, aby przekonwertować go na liczbę całkowitą. I skończyć z:

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

Wielkie dzięki za wyjaśnienie! Nadal nowe w tej sprawie ... Nie wiem, która odpowiedź jest prawdziwa ... – Tintin81

+0

W celu uzyskania dalszych informacji, 'Time.now' pochodzi z Ruby, ponieważ' Time.current' pochodzi z Rails. Tak więc 'Time.current' jest potwierdzany przez strefę czasową aplikacji Rails i' Time.now' używa strefy czasowej serwera. Z mojego doświadczenia zawsze korzystam z 'Time.current' na twojej aplikacji Railsowej dla spójności strefy czasowej – vutran

+0

Nie, nie powinieneś w ogóle używać tutaj' Time.current', zajmuje to więcej czasu, a ponieważ natychmiast przekształcasz go w Uniksowy znacznik czasu, nie dbasz w ogóle o spójność strefy czasowej. (Uniksowe znaczniki czasu zawsze odnoszą się do UTC). Tak więc, podczas gdy to, co mówisz, jest prawdą w 99% przypadków, ten jeden wynik spada na ostatni 1%. –

13

Get Time obiekt z Time.now, nazywając #to_i Zwraca Unix timestamp (sekund od epoki). #to_f daje ułamków sekund, które można użyć, aby uzyskać milisekund od epoki:

Time.now.to_f * 1000 
+0

To podróbki milliseconds – brauliobo

100
require 'date' 

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

Uwaga dla użytkowników Rails: metoda 'strftime' dostarczana przez' ActiveSupport :: TimeWithZone' nie zawiera specyfikatorów '% s' i'% Q'. Najpierw musisz przekonwertować na zwykły Ruby 'DateTime', używając metody' to_datetime'. –

+3

@LonnonFoster Teraz działa (po prostu przetestowane w konsoli Rails). – Nikola

+0

Witam, jak mogę zrobić to samo, ale nie teraz, ale raczej z pola daty? – Tomer

13

Bądź ostrożny, nie pomylić. Fakt, że Ruby wspiera ideę ułamkowych sekund jako liczby zmiennoprzecinkowej, nie czyni z niej liczby zmiennoprzecinkowej. Wpadłem w kłopoty z tym, kiedy robiłem porównania czasowe Wiresharka w Pythonie ... obliczenia czasu w pcap-ng po prostu nie działały. Dopiero gdy potraktowałem dwie części (całkowite sekundy i całkowe nanosekundy), jako obie liczby całkowite, udało mi się uzyskać odpowiednie liczby.

To dlatego liczb zmiennoprzecinkowych mieć Accuracy problems. Rzeczywiście, szybkie trochę Ruby pokaże, że to_f nie równa, powiedzmy, 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 programista. Możesz być bezpieczny dla 3 cyfr znaczących, ale pozostaje faktem: liczby zmiennoprzecinkowe na komputerach są przybliżeniami. Nanosekundowe liczniki na nowoczesnych komputerach są liczbami całkowitymi.

+0

Lepsza odpowiedź. Dziękuję Ci. Można również użyć formatu dyrektywy '' '.strftime ("% 9N ")' ''. http://ruby-doc.org/core-2.3.1/Time.html#method-i-strftime – rplaurindo

8

Korzystanie strftime można uzyskać liczbę sekund i dołączyć milisekund ułamkowych (lub mniejszych jednostek, w razie potrzeby):

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

Zauważ jednak, że to nie okrągła, to obcina, jak można zobaczyć z to_f lub jeśli wychodzić do mikrosekund:

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

i roztwór to_f/to_i ma ten sam problem:

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

więc jeśli naprawdę dbać o dokładność milisekundy, lepiej postawić może być to_f z round:

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

Powiedział, że jak noted in the docs „IEEE 754 double nie jest wystarczająco dokładne, by reprezentować liczbę nanosekund od Epoki”, więc jeśli naprawdę naprawdę troska, rozważenia to_r zamiast to_f -

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

- chociaż jeśli zaokrąglasz tylko do milisekund, prawdopodobnie nic ci nie jest.

0

typecast Integer (1E6 * Time.now.to_f) zwraca Bignum która może pomieścić milisekundy

Powiązane problemy