Ответ 1
Вычитание двух DateTimes возвращает прошедшее время в днях, поэтому вы можете просто сделать:
elapsed_seconds = ((end_time - start_time) * 24 * 60 * 60).to_i
У меня есть код, который отслеживает время для сотрудников. Он создает счетчик, чтобы показать работнику, как долго они были синхронизированы.
Это текущий код:
start_time = Time.parse(self.settings.first_clock_in)
total_seconds = Time.now - start_time
hours = (total_seconds/ 3600).to_i
minutes = ((total_seconds % 3600) / 60).to_i
seconds = ((total_seconds % 3600) % 60).to_i
Это прекрасно работает. Но поскольку время ограничено диапазоном 1970-2038 годов, мы пытаемся заменить все использование времени на DateTimes. Я не могу понять, как получить количество секунд между двумя DateTimes. Вычитание их дает Rational, который я не знаю, как интерпретировать, тогда как вычитание Times дает разницу в секундах.
Вычитание двух DateTimes возвращает прошедшее время в днях, поэтому вы можете просто сделать:
elapsed_seconds = ((end_time - start_time) * 24 * 60 * 60).to_i
Или, более читаемо:
diff = datetime_1 - datetime_2
diff * 1.days # => difference in seconds; requires Ruby on Rails
Заметьте, что вы или некоторые другие поисковики действительно можете найти:
diff = datetime_1 - datetime_2
Date.day_fraction_to_time(diff) # => [h, m, s, frac_s]
Вы можете преобразовать их в float с помощью to_f
, хотя это приведет к обычной потере точности, связанной с поплавками. Если вы просто отбрасываете целое число целых секунд, оно не должно быть достаточно большим, чтобы беспокоиться.
Результаты отображаются в секундах:
>> end_time.to_f - start_time.to_f
=> 7.39954495429993
>> (end_time.to_f - start_time.to_f).to_i
=> 7
В противном случае вы можете посмотреть на to_formatted_s
на объект DateTime и посмотреть, можете ли вы уговорить вывод во что-то, что класс Decimal
примет, или просто форматирует его как простое Unix-время в качестве строки и вызывает to_i
на этом.
Я использую ruby-2.1.4, и для меня следующие работающие
Time.now - Time.new(2014,11,05,17,30,0)
дал мне разницу во времени секунд
ссылка: ruby doc
Другие неверно полагаются на дроби или вспомогательные функции. Это намного проще. Сам DateTime является целочисленным. Здесь путь Ruby:
stop.to_i - start.to_i
Пример:
start = Time.now
=> 2016-06-21 14:55:36 -0700
stop = start + 5.seconds
=> 2016-06-21 14:55:41 -0700
stop.to_i - start.to_i
=> 5
есть способ, сделанный для этого:
Time.now.minus_with_coercion(10.seconds.ago)
равно 10.
Источник: http://apidock.com/rails/Time/minus_with_coercion
Надеюсь, я помог.
почему бы не использовать встроенную "сек". Вот пример:
t1 = Time.now.sec
elapsed_t = Time.now.sec - t1
puts "it took me : #{elapsed_t} seconds to do something that is useful \n"
Определите функцию Ruby, подобную этой,
def time_diff(start_time, end_time)
seconds_diff = (start_time - end_time).to_i.abs
days = seconds_diff / 86400
seconds_diff -= days * 86400
hours = seconds_diff / 3600
seconds_diff -= hours * 3600
minutes = seconds_diff / 60
seconds_diff -= minutes * 60
seconds = seconds_diff
"#{days} Days #{hours} Hrs #{minutes} Min #{seconds} Sec"
end
И Вызовите эту функцию,
time_diff(Time.now, Time.now-4.days-2.hours-1.minutes-53.seconds)