106

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

time = new Date().getTime();

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

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

我怎样才能让它显示毫秒数,如jQuery

4

8 回答 8

172
require 'date'

p DateTime.now.strftime('%s') # "1384526946" (seconds)
p DateTime.now.strftime('%Q') # "1384526946523" (milliseconds)
于 2013-11-15T14:51:05.383 回答
109

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

RubyTime.now.to_i会给你自纪元以来的秒数。如果将其更改为Time.now.to_f,您仍然可以获得秒数,但带有小数部分。只需将其乘以 1,000,您就有了毫秒数。然后使用#to_i将其转换为整数。你最终得到:

(Time.now.to_f * 1000).to_i
于 2012-10-30T23:16:29.143 回答
33

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

于 2012-10-30T23:12:26.360 回答
28

使用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或者如果您达到微秒级:

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

to_f/to_i解决方案有同样的问题(to_i不圆,它截断):

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

因此,如果您真的关心毫秒精度,更好的选择可能to_fround

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

也就是说,正如文档中所述,“IEEE 754 双精度不足以表示自纪元以来的纳秒数”,因此,如果您真的在意,请考虑to_r而不是to_f-

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

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

于 2015-06-02T19:28:43.117 回答
19

小心,不要混淆。事实上,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 位有效数字可能是安全的,但事实仍然存在:计算机上的浮点数是近似值。现代计算机上的纳秒计数器是整数。

于 2015-04-10T22:06:38.563 回答
13

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

Time.now.to_f * 1000
于 2013-11-15T13:16:38.083 回答
0

类型转换 Integer(1e6*Time.now.to_f) 返回一个可以保存毫秒的 Bignum

于 2015-07-03T00:25:27.230 回答
0

使用Process.clock_gettime

>> Process.clock_gettime(Process::CLOCK_REALTIME, :millisecond)
=> 1644588106765

https://ruby-doc.org/core-3.1.0/Process.html#method-c-clock_gettime

于 2022-02-11T14:03:47.897 回答