Saya memiliki jQuery
fungsi ini yang mengembalikan waktu saat ini sebagai jumlah milidetik sejak periode (1 Jan 1970):
time = new Date().getTime();
Apakah ada cara untuk melakukan hal yang sama di Ruby?
Saat ini, saya menggunakan Ruby Time.now.to_i
yang berfungsi dengan baik tetapi mengembalikan 10 digit integer (jumlah detik)
Bagaimana saya bisa membuatnya menampilkan jumlah milidetik, seperti dalam jQuery
?
Jawaban:
require 'date' p DateTime.now.strftime('%s') # "1384526946" (seconds) p DateTime.now.strftime('%Q') # "1384526946523" (milliseconds)
sumber
strftime
metode yang disediakanActiveSupport::TimeWithZone
tidak termasuk%s
dan%Q
penentu. Anda harus mengonversi ke Ruby biasaDateTime
terlebih dahulu, menggunakanto_datetime
metode ini.Javascript
gettime()
mengembalikan jumlah milidetik sejak periode.Ruby
Time.now.to_i
akan memberi Anda jumlah detik sejak epoch. Jika Anda mengubahnya menjadiTime.now.to_f
, Anda masih mendapatkan detik tetapi dengan komponen pecahan. Kalikan saja dengan 1.000 dan Anda mendapatkan milidetik. Kemudian gunakan#to_i
untuk mengubahnya menjadi integer. Dan Anda berakhir dengan:(Time.now.to_f * 1000).to_i
sumber
Time.now
berasal dari Ruby karenaTime.current
berasal dari Rails. DemikianlahTime.current
yang diakui oleh zona waktu aplikasi Rails danTime.now
menggunakan zona waktu server. Dalam pengalaman saya, selalu gunakanTime.current
pada aplikasi Rails Anda untuk konsistensi zona waktuTime.current
di sini sama sekali, membutuhkan waktu lebih lama untuk membuatnya, dan karena Anda segera mengubahnya menjadi stempel waktu unix, Anda sama sekali tidak peduli dengan konsistensi zona waktu. (Stempel waktu Unix selalu berhubungan dengan UTC). Jadi, sementara apa yang Anda katakan benar dalam 99% kasus, yang satu ini dari segi kinerja turun di 1% terakhir.:epoch
metode: kelas Waktu def epoch (self.to_f * 1000). To_i end end(Time.now.to_f * 1000).to_i
harus melakukan hal yang sama.sumber
to_f
menyertakan milidetik sebagai desimal.Dengan menggunakan
strftime
, Anda bisa mendapatkan jumlah detik dan menambahkan milidetik pecahan (atau unit yang lebih kecil, jika perlu):2.2.2 :001 > t = Time.new => 2015-06-02 12:16:56 -0700 2.2.2 :002 > t.strftime('%s%3N') => "1433272616888"
Perhatikan bahwa ini tidak bulat, ini terpotong, seperti yang Anda lihat dengan
to_f
atau jika Anda keluar ke mikrodetik:2.2.2 :003 > t.to_f => 1433272616.888615 2.2.2 :004 > t.usec => 888615
dan
to_f
/to_i
solusi memiliki masalah yang sama:2.2.2 :009 > (t.to_f * 1000).to_i => 1433272616888
jadi jika Anda benar-benar peduli dengan akurasi milidetik, taruhan yang lebih baik mungkin
to_f
denganround
:2.2.2 :010 > (t.to_f * 1000).round => 1433272616889
Yang mengatakan, seperti yang dicatat dalam dokumen , "IEEE 754 double tidak cukup akurat untuk mewakili jumlah nanodetik sejak Epoch", jadi jika Anda benar- benar peduli, pertimbangkan
to_r
daripadato_f
-2.2.2 :011 > (t.to_r * 1000).round => 1433272616889
- meskipun jika Anda hanya membulatkan ke milidetik Anda mungkin baik-baik saja.
sumber
Hati-hati, jangan bingung. Fakta bahwa Ruby mendukung gagasan pecahan detik sebagai pelampung sebenarnya tidak menjadikannya sebagai bilangan floating point. Saya mendapat masalah dengan ini ketika saya melakukan perbandingan waktu cap waktu Wireshark dengan Python ... perhitungan waktu di pcap-ng tidak berfungsi. Hanya ketika saya memperlakukan dua bagian (detik integral dan nanodetik integral) karena kedua bilangan bulat saya bisa mendapatkan angka yang tepat.
Itu karena angka floating point memiliki masalah Akurasi . Memang, sedikit Ruby akan menunjukkan kepada Anda bahwa to_f tidak sama, katakanlah, 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. Anda mungkin aman untuk 3 digit signifikan, tetapi faktanya tetap: Angka floating point di komputer adalah perkiraan. Penghitung nanodetik pada komputer modern adalah bilangan bulat.
sumber
.strftime("%9N")
juga bisa digunakan. ruby-doc.org/core-2.3.1/Time.html#method-i-strftimeDapatkan objek Waktu dengan
Time.now
, memanggil#to_i
mengembalikan stempel waktu Unix (detik dari epoch).#to_f
memberikan pecahan detik yang dapat Anda gunakan untuk mendapatkan milidetik dari epoch:Time.now.to_f * 1000
sumber
Typecast Integer (1e6 * Time.now.to_f) mengembalikan Bignum yang dapat menahan milidetik
sumber