如何获取Ruby on Rails中两个DateTime之间的秒数

我有代码可以为员工进行时间跟踪。 它创build一个柜台,向员工展示他们的工作时间。

这是当前的代码:

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年的范围内,所以我们试图用DateTimereplace所有的时间使用。 我无法弄清楚如何获得两个date时间之间的秒数。 减去它们会产生一个我不知道如何解释的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 

请注意,您或其他search者可能真正在寻找的是:

 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 

否则,你可以看看在DateTime对象上使用to_formatted_s ,看看你是否可以将输出转换成Decimal类可以接受的东西,或者只是把它格式化为一个普通的Unix时间string,然后调用to_i

我正在使用ruby2.1.4和以下工作

 Time.now - Time.new(2014,11,05,17,30,0) 

给了我几秒钟的时间差

参考: ruby文档

其他人不正确地依赖分数或帮助函数。 这比这简单得多。 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)