在Ruby中获取最精确的时间

时间:2017-04-03 01:12:49

标签: ruby

我希望使用Ruby获得尽可能多的精确时间。例如:

{{1}}

然而,即使使用strftime,我仍然无法实现目标。那么还有其他方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:3)

Ruby可用的最精确的计时器是Process::clock_gettime。为避免精确浮动舍入,请使用:nanosecond单位:

3.times { p Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond) }
# => 1491185078101717000
# => 1491185078101741000
# => 1491185078101747000

编辑:这是Time.now提供的同一时间。在Linux上,两者具有纳秒精度。但是,即使在OSX上,还有另一个时钟具有纳秒精度:CLOCK_MONOTONIC。此时钟不会跟踪纪元的时间,而是来自"某些事件"的时间,此事件通常是您计算机的启动时间。为了获得最精确的时间,可以在CLOCK_REALTIMECLOCK_MONOTONIC之间取得差异并稍后应用:

clock_diff = Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond) -
       Process.clock_gettime(Process::CLOCK_MONOTONIC, :nanosecond)

3.times {
  nsec = Process.clock_gettime(Process::CLOCK_MONOTONIC, :nanosecond) + clock_diff
  time = Time.at(nsec / 1_000_000_000, nsec % 1_000_000_000 / 1_000.0)
  p time.strftime("%Y-%m-%d %H:%i:%s.%N")
}

答案 1 :(得分:1)

在Linux上,我认为最准确的时间只是Time.nowto_r方法"旨在用于获得表示自Epoch以来纳秒的准确值。 (来自docs)。

t = Time.now

p t.to_r  # =>(1491206113721862629/1000000000)
p [t.to_i, t.nsec] # =>[1491206113, 721862629]

答案 2 :(得分:1)

在JRuby上,您可以使用java.lang.System.nano_time

java.lang.System.nano_time - java.lang.System.nano_time
# -15607

从固定但任意的原点获得纳秒。来自文档:

  

此方法只能用于测量经过的时间而不是   与系统或挂钟时间的任何其他概念有关。价值   返回表示自某些固定但任意来源以来的纳秒   时间(也许在将来,所以价值可能是负面的)。相同   在a的实例中,此方法的所有调用都使用origin   Java虚拟机;其他虚拟机实例很可能   使用不同的来源。

如果你想要一个精确的Java时间< 9,你可以使用currentTimeMillis

java.lang.System.current_time_millis
#=> 1491214503112

但是,你不会从Time.now获得更多信息:

Time.now.to_f
#=> 1491214592.562

所以Time.now可能是你最好的选择:它适用于任何系统上的任何Ruby版本。请注意纳秒精度doesn't mean纳秒精度。

我敢说你可以忽略与毫秒相关的任何数字。你可以用微米输出纽约和洛杉矶之间的距离,但这并不意味着它会有用。