Как получить истекшее время в миллисекундах в Ruby?

Если у меня есть объект Time, полученный из:

Time.now

и позже я создаю экземпляр другого объекта с той же строкой, как я могу узнать, сколько миллисекунд прошло? Второй объект может быть создан в ту же минуту, в течение следующих минут или даже часов.

Ответ 1

Как уже говорилось, вы можете работать с объектами 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

Вам нужно будет решить, урезать это или нет.

Ответ 2

Вы можете добавить немного синтаксического сахара в вышеупомянутое решение со следующим:

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

Ответ 3

Я думаю, что ответ неправильно выбран, этот метод дает секунды, а не миллисекунды.

t = Time.now.t­o_f
=> 1382471965.146

Здесь я полагаю, что плавающее значение равно миллисекундам

Ответ 4

Ответ на ezpz почти идеальный, но я надеюсь, что могу добавить немного больше.

Гео спросил о времени в миллисекундах; это звучит как целое число, и я не стал бы брать объезд через плавучую землю. Таким образом, мой подход:

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,...) почти такие же, как для функций C, найденных в любой системе Unix/Linux; и

  • Есть еще несколько: в частности, % L выполняет миллисекунды!

Ответ 5

Time.now.to_f может вам помочь, но он возвращает секунды.

В общем, при работе с эталонами I:

  • вставить переменную текущее время;
  • вставить блок для проверки;
  • введите текущее время в переменную, вычитая предыдущее текущее значение;

Это очень простой процесс, поэтому я не уверен, что вы действительно спрашивали об этом...

Ответ 6

Чтобы получить время в миллисекундах, лучше добавить .round(3), поэтому в некоторых случаях оно будет более точным:

puts Time.now.to_f # => 1453402722.577573

(Time.now.to_f.round(3)*1000).to_i  # => 1453402722578

Ответ 7

Попробуйте вычесть первое Time.now со второго. Например:

a = Time.now
sleep(3)
puts Time.now - a # about 3.0

Это дает вам число с плавающей запятой секунд между двумя (и с этим миллисекундами).

Ответ 8

%L дает миллисекунды в рубине

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

или

puts Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")

даст вам текущую временную метку в миллисекундах.