Как получить количество секунд между двумя датами в Ruby on Rails
У меня есть код, который делает учет рабочего времени для сотрудников. Он создает счетчик, чтобы показать сотруднику, как долго они были синхронизированы.
Это текущий код:
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 годов, мы пытаемся заменить все время использования датами. Я не могу понять, как получить количество секунд между двумя датами. Вычитание их дает рациональное, которое я не знаю, как интерпретировать, в то время как вычитание раз дает разницу в секундах.
8 ответов:
вычитание двух 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]
вы можете конвертировать их в поплавки с
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, как a строка и вызовto_iоб этом.
Я использую ruby-2.1.4 и для меня следующее работало
Time.now - Time.new(2014,11,05,17,30,0)дал мне разницу во времени в секунд
ссылки: ruby doc
другие неправильно полагаются на дроби или вспомогательные функции. Все гораздо проще. Сам DateTime является целым числом внизу. Вот рубиновый путь:
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
надеюсь, что помогла.
определите такую функцию 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)
почему бы не использовать встроенный "sec". Вот пример :
t1 = Time.now.sec elapsed_t = Time.now.sec - t1 puts "it took me : #{elapsed_t} seconds to do something that is useful \n"
Comments