如果我有一个Time
对象来自:
Time.now
以后我用同一行实例化另一个对象,我怎么能看到已经过了多少毫秒?第二个对象可以在同一分钟内创建,在接下来的几分钟甚至几小时内完成。
答案 0 :(得分:121)
如上所述,您可以对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
您需要决定是否截断。
答案 1 :(得分:56)
您可以使用以下内容向上述解决方案添加一些语法糖:
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
答案 2 :(得分:26)
我认为答案选择错误,该方法给出的是秒,而不是毫秒。
t = Time.now.to_f
=> 1382471965.146
这里我假设浮动值是毫秒
答案 3 :(得分: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
乘以整数1000可以完美地保留小数,也可以更快一些。
如果您正在处理日期和时间,则可能需要使用 DateTime 类。这种方式类似,但转换因子为24 * 3600 * 1000 = 86400000 。
我发现DateTime的 strptime 和 strftime 函数在解析和格式化日期/时间字符串时非常有用(例如,来自/来自日志)。方便了解的是:
这些函数的格式化字符(%H,%M,%S,...)几乎与任何Unix / Linux系统上的C函数相同;以及
还有一些:特别是,%L 会毫秒!
答案 4 :(得分:9)
要以毫秒为单位获得时间,最好添加.round(3)
,因此在某些情况下会更准确:
puts Time.now.to_f # => 1453402722.577573
(Time.now.to_f.round(3)*1000).to_i # => 1453402722578
答案 5 :(得分:6)
Time.now.to_f可以帮助你,但它会返回秒数。
一般来说,在使用基准时我:
这是一个非常简单的过程,所以我不确定你是不是真的在问这个......
答案 6 :(得分:4)
%L
在ruby中给出毫秒数
require 'time'
puts Time.now.strftime("%Y-%m-%dT%H:%M:%S.%L")
或
puts Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")
将以毫秒为单位给出当前时间戳。
答案 7 :(得分:3)
尝试从第二个减去第一个Time.now。像这样:
a = Time.now
sleep(3)
puts Time.now - a # about 3.0
这为您提供了两次之间的秒数的浮点数(以及毫秒)。
答案 8 :(得分:1)
DateTime.now.strftime("%Q")
用法示例:
>> DateTime.now.strftime("%Q")
=> "1541433332357"
>> DateTime.now.strftime("%Q").to_i
=> 1541433332357
答案 9 :(得分:0)
答案类似于:
t_start = Time.now
# time-consuming operation
t_end = Time.now
milliseconds = (t_start - t_end) * 1000.0
但是,Time.now
方法存在不准确的风险。我发现了Luca Guidi的这篇文章:
https://blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-way/
系统时钟一直在浮动,并且仅向前移动。如果您基于它来计算经过时间,则很可能会遇到计算错误甚至是outages。
因此,建议改用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
示例:
elapsed = measure_time do
# your time-consuming task here:
sleep 2.2321
end
=> 2.232