如何在Ruby中将当前时间作为13位整数?

Tin*_*n81 80 ruby

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

time = new Date().getTime();
Run Code Online (Sandbox Code Playgroud)

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

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

如何让它显示毫秒数,如jQuery

ste*_*lag 138

require 'date'

p DateTime.now.strftime('%s') # "1384526946" (seconds)
p DateTime.now.strftime('%Q') # "1384526946523" (milliseconds)
Run Code Online (Sandbox Code Playgroud)

  • Rails用户注意:`ActiveSupport :: TimeWithZone`提供的`strftime`方法不包括`%s`和`%Q`说明符.你需要先使用`to_datetime`方法转换为普通的Ruby`DateTime`. (27认同)
  • @LonnonFoster现在它可以工作(刚刚在Rails控制台中测试过). (5认同)

Ant*_*one 93

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

Ruby Time.now.to_i会给你自纪元以来的秒数.如果你改变它Time.now.to_f,你仍然得到秒,但有一个小数组件.只需乘以1,000就可以得到毫秒数.然后使用#to_i将其转换为整数.你最终得到:

(Time.now.to_f * 1000).to_i
Run Code Online (Sandbox Code Playgroud)

  • 不,你根本不应该在这里使用 `Time.current` ,它需要更长的时间来构造,并且由于你立即将其转换为 unix 时间戳,所以你根本不关心时区一致性。(Unix 时间戳始终与 UTC 相关)。因此,虽然您所说的在 99% 的情况下都是正确的,但从性能角度来看,这一情况却落在最后 1% 的情况下。 (3认同)

Zac*_*emp 26

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


Mik*_*e S 18

小心,不要混淆.事实上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
Run Code Online (Sandbox Code Playgroud)

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


Dav*_*les 15

使用strftime,您可以获得秒数并附加小数毫秒(或更小的单位,如果需要):

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

请注意,虽然这不会舍入,但它会截断,正如您可以看到的那样,to_f或者如果您出现微秒:

2.2.2 :003 > t.to_f
 => 1433272616.888615
2.2.2 :004 > t.usec
 => 888615 
Run Code Online (Sandbox Code Playgroud)

to_f/ to_i解决方案有同样的问题:

2.2.2 :009 > (t.to_f * 1000).to_i
 => 1433272616888
Run Code Online (Sandbox Code Playgroud)

所以,如果你真的关心毫秒的精度,更好的选择可能是to_fround:

2.2.2 :010 > (t.to_f * 1000).round
 => 1433272616889
Run Code Online (Sandbox Code Playgroud)

也就是说,如文档中所述,"IEEE 754双精度不足以表示自大纪元以来的纳秒数",所以如果你真的非常关心,请考虑to_r代替to_f-

2.2.2 :011 > (t.to_r * 1000).round
 => 1433272616889 
Run Code Online (Sandbox Code Playgroud)

- 虽然如果你只是四舍五入到几毫秒,你可能会很好.


lev*_*lex 13

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

Time.now.to_f * 1000
Run Code Online (Sandbox Code Playgroud)

  • 这假装毫秒 (2认同)