如何在Ruby中获取经过的时间(以毫秒为单位)?

Geo*_*Geo 94 ruby

如果我有一个Time对象来自:

Time.now
Run Code Online (Sandbox Code Playgroud)

然后我用同一行实例化另一个对象,我怎么能看到已经过了多少毫秒?第二个对象可以在接下来的几分钟甚至几小时内创建相同的分钟.

ezp*_*zpz 127

如前所述,您可以对Time对象进行操作,就好像它们是数值(或浮点)值一样.这些操作产生可以容易地转换的第二分辨率.

例如:

def time_diff_milli(start, finish)
   (finish - start) * 1000.0
end

t1 = Time.now
# arbitrary elapsed time
t2 = Time.now

msecs = time_diff_milli t1, t2
Run Code Online (Sandbox Code Playgroud)

您需要决定是否截断.

  • 如果使用rails或active支持,你可以使用#in_milliseconds方法进行相同的转换`(t2-t1).in_milliseconds` (4认同)
  • 添加一个to_i,你将它作为一个整数,例如:((完成 - 开始)*1000.0).to_i (2认同)

phl*_*per 58

您可以使用以下内容向上述解决方案添加一些语法糖:

class Time
  def to_ms
    (self.to_f * 1000.0).to_i
  end
end

start_time = Time.now
sleep(3)
end_time = Time.now
elapsed_time = end_time.to_ms - start_time.to_ms  # => 3004
Run Code Online (Sandbox Code Playgroud)


Low*_*ory 29

我认为答案选择错误,该方法给出了秒,而不是毫秒.

t = Time.now.t­o_f
=> 1382471965.146
Run Code Online (Sandbox Code Playgroud)

这里我假设浮动值是毫秒

  • 所选答案是正确的。对“Time.now”使用加法或减法将时间视为浮点值,小数点前为秒,小数点后最多为纳秒(尽管纳秒可能不完全准确)。因此,将该值乘以“1000.0”即可得到毫秒。 (3认同)
  • 是的,但仅给出“Time.now”是不准确的,并且不能准确回答问题。 (2认同)

Ste*_*Yue 11

要以毫秒为单位获得时间,最好添加.round(3),因此在某些情况下会更准确:

puts Time.now.to_f # => 1453402722.577573

(Time.now.to_f.round(3)*1000).to_i  # => 1453402722578
Run Code Online (Sandbox Code Playgroud)


Rya*_*ary 11

DateTime.now.strftime("%Q")
Run Code Online (Sandbox Code Playgroud)

用法示例:

>> DateTime.now.strftime("%Q")
=> "1541433332357"

>> DateTime.now.strftime("%Q").to_i
=> 1541433332357
Run Code Online (Sandbox Code Playgroud)


Car*_*icz 9

ezpz的答案几乎是完美的,但我希望我能再添加一点.

Geo以毫秒为单位询问时间; 这听起来像一个整数,我不会绕过浮点土地.因此,我的方法是:

irb(main):038:0> t8 = Time.now
=> Sun Nov 01 15:18:04 +0100 2009
irb(main):039:0> t9 = Time.now
=> Sun Nov 01 15:18:18 +0100 2009
irb(main):040:0> dif = t9 - t8
=> 13.940166
irb(main):041:0> (1000 * dif).to_i
=> 13940
Run Code Online (Sandbox Code Playgroud)

乘以整数1000可以完美地保留小数,也可以快一点.

如果您正在处理日期和时间,则可能需要使用DateTime类.这种方法类似,但转换因子为24*3600*1000 = 86400000.

我发现DateTime的strptimestrftime函数在解析和格式化日期/时间字符串(例如到/从日志)中是非常宝贵的.方便了解的是:

  • 这些函数的格式化字符(%H,%M,%S,...)与任何Unix/Linux系统上的C函数几乎相同; 和

  • 还有一些:特别是,%L确实毫秒!


小智 6

Time.now.to_f可以帮助你,但它返回秒.

一般来说,在使用基准测试时我:

  • 把当前时间变为可变;
  • 插入块进行测试;
  • 将变量放入当前时间,减去前面的当前时间值;

这是一个非常简单的过程,所以我不确定你是不是真的在问这个......


Rob*_*ert 6

答案是这样的:

t_start = Time.now
# time-consuming operation
t_end = Time.now

milliseconds = (t_start - t_end) * 1000.0
Run Code Online (Sandbox Code Playgroud)

然而,这种Time.now方法有不准确的风险。我找到了 Luca Guidi 的这篇文章:

https://blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-way/

系统时钟不断浮动,它不会只向前移动。如果您根据它计算已用时间,您很可能会遇到计算错误甚至中断

所以,建议Process.clock_gettime改用。就像是:

def measure_time
  start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  yield
  end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  elapsed_time = end_time - start_time
  elapsed_time.round(3)
end
Run Code Online (Sandbox Code Playgroud)

例子:

elapsed = measure_time do
    # your time-consuming task here:
    sleep 2.2321
end

=> 2.232
Run Code Online (Sandbox Code Playgroud)


小智 5

%L 给出毫秒的红宝石

require 'time'
puts Time.now.strftime("%Y-%m-%dT%H:%M:%S.%L")
Run Code Online (Sandbox Code Playgroud)

要么

puts Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")
Run Code Online (Sandbox Code Playgroud)

将为您提供当前时间戳(以毫秒为单位)。