如何在Ruby中获取当前的13位整数?

我有这个jQuery函数返回当前时间为自纪元(1970年1月1日)以来的毫秒数:

 time = new Date().getTime(); 

有没有办法在Ruby中做同样的事情?

现在,我正在使用Ruby的Time.now.to_i ,它很好,但返回一个10位数的整数(秒数)

我怎样才能得到它显示的毫秒数,如在jQuery

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

Javascript的gettime()返回自纪元以来的毫秒数。

Ruby的Time.now.to_i会给你自纪元以来的秒数。 如果你把它Time.now.to_f ,你仍然会得到秒数,但是有一个小数部分。 只要乘以1000,你有毫秒。 然后使用#to_i将其转换为整数。 最后你会得到:

 (Time.now.to_f * 1000).to_i 

(Time.now.to_f * 1000).to_i应该做同样的事情。

使用Time.now获取Time对象,调用#to_i将返回一个Unix时间戳(从纪元开始的秒数)。 #to_f给出小数秒,您可以使用它来从纪元获得毫秒:

 Time.now.to_f * 1000 

要小心,不要混淆。 Ruby支持小数秒作为浮点数的事实实际上并不是浮点数。 当我在Python中进行Wireshark时间戳比较时遇到了麻烦… pcap-ng中的时间计算不起作用。 只有当我对待这两个部分(整数秒和积分纳秒),因为这两个整数是我能够得到正确的数字。

这是因为浮点数有精度问题 。 事实上,Ruby的一小部分会告诉你,to_f不等于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 

警告程序员。 您可能对3位有效数字是安全的,但事实仍然是:计算机上的浮点数是近似值。 现代计算机上的纳秒计数器是整数。

使用strftime ,你可以得到秒数,并追加小数毫秒(如果需要,还可以是更小的单位):

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

请注意,虽然这不是圆的,但它会截断,正如你可以用to_f看到的to_f或者如果你出去微秒:

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

to_f / to_i解决scheme也有同样的问题:

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

所以如果你真的关心毫秒的准确性, round更好的select可能是:

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

也就是说,正如在文档中指出的 ,“IEEE 754双精度不足以表示自Epoch以来的纳秒数”,所以如果真的真的在意,可以考虑to_r而不是to_f

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

– 虽然如果你只是四舍五入到毫秒,你可能没问题。

整型(1e6 * Time.now.to_f)的types转换返回一个可以保持毫秒的Bignum