我有一个jQuery
函数,该函数返回当前时间(自epoch(1970年1月1日)以来的毫秒数):
time = new Date().getTime();
有没有办法在Ruby中做同样的事情?
现在,我使用的RubyTime.now.to_i
效果很好,但返回的是10位整数(秒数)
如何获得显示毫秒数的信息,如中所示jQuery
?
我有一个jQuery
函数,该函数返回当前时间(自epoch(1970年1月1日)以来的毫秒数):
time = new Date().getTime();
有没有办法在Ruby中做同样的事情?
现在,我使用的RubyTime.now.to_i
效果很好,但返回的是10位整数(秒数)
如何获得显示毫秒数的信息,如中所示jQuery
?
Answers:
require 'date'
p DateTime.now.strftime('%s') # "1384526946" (seconds)
p DateTime.now.strftime('%Q') # "1384526946523" (milliseconds)
strftime
提供的方法ActiveSupport::TimeWithZone
不包括%s
和%Q
指示符。您首先需要DateTime
使用to_datetime
方法转换为纯Ruby 。
Javascriptgettime()
返回自纪元以来的毫秒数。
RubyTime.now.to_i
将为您提供自纪元以来的秒数。如果将其更改为Time.now.to_f
,您仍然会得到秒数,但具有小数部分。只需将其乘以1,000,就可以得到毫秒数。然后使用#to_i
将其转换为整数。结果是:
(Time.now.to_f * 1000).to_i
Time.now
它来自Ruby,而Time.current
来自Rails。因此Time.current
,Rails应用程序时区已确认它并Time.now
正在使用服务器时区。根据我的经验,请始终Time.current
在您的Rails应用程序上使用以确保时区一致性
Time.current
在这里使用它,它会花费更长的时间,并且由于您将立即将其转换为unix时间戳,因此您根本不需要关心时区的一致性。(Unix时间戳始终与UTC有关)。因此,虽然您说的是在99%的情况下都是正确的,但从性能角度来看,这仅是最后1%。
:epoch
方法:Time def epoch类(self.to_f * 1000).to_i end end
(Time.now.to_f * 1000).to_i
应该做同样的事情。
to_f
包含毫秒作为小数。
使用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
解决方案具有相同的问题:
2.2.2 :009 > (t.to_f * 1000).to_i
=> 1433272616888
所以,如果你真的关心毫秒的精度,更好的选择可能是to_f
带round
:
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
-尽管如果只舍入到毫秒,则可能很好。
注意,不要感到困惑。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("%9N")
也可以使用。 ruby-doc.org/core-2.3.1/Time.html#method-i-strftime