如何得到 Ruby on Rails 中两个 DateTimes 之间的秒数

我有个代码,可以追踪员工的时间。它创建一个计数器来显示员工已经打卡多久了。

这是目前的代码:

  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年的范围内,我们正试图用日期时间代替所有时间的使用。我不知道如何得到两个日期时间之间的秒数。减去它们会产生一个我不知道如何解释的 Rational,而减去 Times 会产生几秒钟的差异。

注意: 自 Ruby 1.9.2以来,Time 的硬限制被移除了。但是,Time 针对1823-11-12和2116-02-20之间的值进行了优化。

76597 次浏览

您可以使用 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 时间作为字符串并在其上调用 to_i

减去两个 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]

我正在使用 ruby-2.1.4,对我来说下面的工作

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

给了我 几秒钟的时差

参考资料: Ruby Doc

有一种方法可以解决这个问题:

Time.now.minus_with_coercion(10.seconds.ago)

等于10。

资料来源: http://apidock.com/rails/Time/minus_with_coercion

希望我帮上忙了。

其他函数则不正确地依赖分数或辅助函数。比那简单多了。日期时间本身在下面是整数。以下是 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

像这样定义一个 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)