Ruby'de şimdiki zaman 13 haneli tamsayı olarak nasıl elde edilir?


88

jQueryŞu anki zamanı, çağdan beri geçen milisaniye sayısı olarak döndüren bu işleve sahibim (1 Ocak 1970):

time = new Date().getTime();

Ruby'de aynısını yapmanın bir yolu var mı?

Şu anda, Time.now.to_iharika çalışan ancak 10 basamaklı bir tamsayı (saniye sayısı) döndüren Ruby'yi kullanıyorum

Milisaniye sayısını olduğu gibi göstermesini nasıl sağlayabilirim jQuery?


5
Bu bir "jQuery işlevi" değil, sadece basit ECMAScript (javascript). Belki de -1'i harekete geçiren buydu, gerçi biraz sert.
RobG

Yanıtlar:


155
require 'date'

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

31
Rails kullanıcıları için not: strftimetarafından sağlanan yöntem ve belirticilerini ActiveSupport::TimeWithZoneiçermez . Yöntemi kullanarak önce sade bir Ruby'ye dönüştürmeniz gerekir . %s%QDateTimeto_datetime
Lonnon Foster

6
@LonnonFoster Şimdi çalışıyor (sadece Rails konsolunda test edildi).
Nikola Stojaković

Merhaba, aynı şeyi nasıl yapabilirim ama şimdilik değil, bir tarih alanından?
Tomer

Bunu burada
buldum

Bunun yuvarlama yerine kesildiğini unutmayın (örnekte görebileceğiniz gibi - 1384526946523ms, 1384526947s'ye yuvarlanmalıdır).
David Moles

102

Javascript gettime(), epoch'tan beri geçen milisaniye sayısını döndürür.

Ruby Time.now.to_isize çağdan bu yana geçen saniye sayısını verecektir. Bunu olarak değiştirirseniz Time.now.to_f, yine de saniyeler alırsınız, ancak kesirli bir bileşenle. Bunu 1.000 ile çarptığınızda milisaniyeleriniz var. Sonra #to_ionu bir tam sayıya dönüştürmek için kullanın. Ve sonunda:

(Time.now.to_f * 1000).to_i

Açıklama için çok teşekkürler! Hala her şeyde yeni ... Hangi cevabı doğru cevap olarak işaretleyeceğinizi bilmiyorum ...
Tintin81

1
Daha fazla bilgi için Ruby'den Time.nowgeliyor çünkü Time.currentRails'den geliyor. Bu nedenle Time.current, Rails uygulaması saat dilimi tarafından onaylanır ve Time.nowsunucu saat dilimini kullanır. Tecrübelerime göre, Time.currentsaat dilimi tutarlılığı için her zaman Rails uygulamanızda kullanın
vutran

1
Hayır, Time.currentburada hiç kullanmamalısınız , inşa etmek daha uzun sürüyor ve onu hemen bir unix zaman damgasına dönüştürdüğünüz için, saat dilimi tutarlılığını hiç umursamıyorsunuz. (Unix zaman damgaları her zaman UTC ile ilgilidir). Yani, vakaların% 99'unda söylediğiniz doğru olsa da, bu performans açısından son% 1'e düşüyor.
Pellmeister

1
Bu benim tercih ettiğim yaklaşım. :epochYapmaktan hoşlandığım bir şey, bir yöntem eklemek için Time sınıfını genişletmek : class Time def epoch (self.to_f * 1000) .to_i end end
Matt Welke

@brauliobo Milisaniyelerin nasıl sahte olduğunu ayrıntılarıyla anlatmak ister misiniz? İfadeniz yanıltıcıdır, OP'nin cevabı kesinlikle doğrudur.
coisnepe

31

(Time.now.to_f * 1000).to_i aynı şeyi yapmalı.


1
@brauliobo sahte milisaniye nedir?
Erik Rothoff

1
@brauliobo to_fOndalık olarak milisaniyeleri içerdiğinden , öyle değil .
CashIsClay

21

Kullanarak strftimesaniye sayısını alabilir ve kesirli milisaniyeleri (veya gerekirse daha küçük birimleri) ekleyebilirsiniz:

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

Bunun yuvarlanmadığını, ancak görebileceğiniz gibi to_fveya mikrosaniyelere çıktığınızda kesildiğini unutmayın :

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

ve to_f/ to_içözümünde aynı sorun var:

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

Eğer gerçekten milisaniye doğruluk umurumda eğer öyleyse, daha iyi bir bahis olabilir to_file round:

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

Bununla birlikte, belgelerde belirtildiği gibi , "IEEE 754 double, Epoch'tan bu yana geçen nanosaniye sayısını temsil edecek kadar doğru değildir", bu nedenle gerçekten umursuyorsanız, to_rbunun yerine şunu düşünün to_f:

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

- ancak sadece milisaniyeye yuvarlıyorsanız muhtemelen iyisinizdir.


18

Dikkatli olun, kafanız karışmasın. Ruby'nin bir kayan nokta olarak kesirli saniye fikrini desteklemesi, aslında onu bir kayan nokta sayısı yapmaz. Python'da Wireshark zaman damgası zaman karşılaştırmaları yaparken bununla başım belaya girdi ... pcap-ng'deki zaman hesaplamaları çalışmıyordu. Sadece iki parçayı (integral saniyeler ve integral nanosaniye) işlediğimde, her iki tamsayı da uygun sayıları alabildiğim için oldu.

Bunun nedeni, kayan nokta sayılarının Doğruluk sorunları olmasıdır . Aslında, hızlı bir Ruby parçası size to_f'nin nsec'e eşit olmadığını gösterecektir:

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

Uyarı Programcısı. 3 önemli basamakta güvende olabilirsiniz, ancak gerçek şu ki: Bilgisayarlardaki kayan nokta sayıları yaklaşık değerlerdir. Modern bilgisayarlardaki nanosaniye sayaçları tam sayılardır.


Daha iyi yanıt. Teşekkür ederim. Yönerge biçimi .strftime("%9N")de kullanılabilir. ruby-doc.org/core-2.3.1/Time.html#method-i-strftime
rplaurindo

13

İle bir Time nesnesi alın Time.now, çağrı #to_ibir Unix zaman damgası döndürür (epoch'tan saniye cinsinden). #to_fçağdan milisaniyeleri almak için kullanabileceğiniz kesirli saniyeleri verir:

Time.now.to_f * 1000

3
bu milisaniye
sahtesi

@brauliobo "Sahte milisaniyeler" nasıl oluyor? Kodu yürütmek ve kendiniz kontrol etmek için zaman ayırdınız mı?
coisnepe

0

Typecast Integer (1e6 * Time.now.to_f), milisaniyeleri tutabilen bir Bignum döndürür

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.