Как получить истекшее время в миллисекундах в 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.to_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")
даст вам текущую временную метку в миллисекундах.