Відповіді:
Як уже було сказано, ви можете оперувати 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
Вам потрібно буде вирішити, чи врізати це чи ні.
finish.to_f - start.to_f
?
finish - start
виходить плаваюча точка; .to_f
було б зайвим.
(t2 - t1).in_milliseconds
Я думаю, що відповідь неправильно обрана, що метод дає секунди, а не мілісекунди.
t = Time.now.to_f
=> 1382471965.146
Тут я думаю, що плаваюче значення - це мілісекунди
Time.now
трактує час як значення з плаваючою комою за секунди до десяткової точки і до наносекунд після десяткової точки (хоча nsec може бути не зовсім точним). Отже, помноживши це значення на 1000.0
вихід мілісекунд.
Відповідь 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 робить мілісекунди!
unknown
:)
DateTime.now.strftime("%Q")
Приклад використання:
>> DateTime.now.strftime("%Q")
=> "1541433332357"
>> DateTime.now.strftime("%Q").to_i
=> 1541433332357
Time.now.to_f може допомогти вам, але він повертається за секунди.
Загалом, під час роботи з орієнтирами я:
Це дуже простий процес, тому я не впевнений, що ви справді про це питали ...
%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")
дасть вам поточну мітку часу в мілісекундах.
Відповідь приблизно така:
t_start = Time.now
# time-consuming operation
t_end = Time.now
milliseconds = (t_start - t_end) * 1000.0
Однак Time.now
підхід ризикує бути неточним. Я знайшов цю публікацію від Лука Гуді:
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
Приклад:
elapsed = measure_time do
# your time-consuming task here:
sleep 2.2321
end
=> 2.232