Ruby 中的日期时间比较和数学运算

DateTime comparison and math in Ruby

我正在尝试编写一个 class 来用 DateTime 做一些数学运算。在实际情况下,我收到这样的 DateTimes:

2015-08-26T12:10:54Z
2015-08-31T05:07:01Z
2016-01-05T10:57:02Z
2016-01-05T10:57:04Z

我需要把这些时间和实际时间进行比较,大致是这样的:

dif = time - Time.now

然后我需要取上面的数学结果,看看它是否等于或大于45分钟,大致是这样的:

threshold = 00:45:00
if dif >= threshold
  puts dif
  #do something
else
  #do something else
end

通常会使用同一天的时间戳来计算差异,但很少会遇到一天到另一天的变化。

我测试了以下代码:

irb(main):001:0> t1 = Time.now
 => 2016-01-08 18:53:58 +0000
irb(main):002:0> t2 = Time.now
 => 2016-01-08 18:54:09 +0000
irb(main):003:0> dif = t2.to_f - t1.to_f
 => 10.176163911819458

但后来我无法将此结果转回可读时间,例如 00:00:11

什么是最好的数学计算方法,所以当代码显示差异时,它会以正确的格式出现,例如 00:14:59

有一个您可能需要的 Time 库,然后它将使用额外的方法扩展默认时间 class,例如 #parse。

require 'time'
t1 = Time.parse('2015-08-26T12:10:54Z') #trusting the heuristic to match this as ISO8601 type date
t2 = Time.parse('2016-01-05T10:57:02Z')

> t2 - t1 
=> 11400368.0 #difference in seconds

由于现在时间以秒为单位,您可以轻松检查 45*60 的差异阈值。但是,您必须非常小心地在两个日期使用相同的时区。

你举了一个 Time.now 的例子,但是它将根据你当地的时区计算,而你提供的日期是 UTC(最后是 "Z")并且 UTC 没有时区.当夏令时在您的时区处于活动状态或不活动状态时,减去它们可以得到不同的结果。

如果您对照 Time.now 检查的每个日期都是 UTC,您应该改用 Time.now.utc

要计算时差,您可以使用 Time.utc(0) 作为基准。

> Time.utc(0)
=> 0000-01-01 00:00:00 UTC
> Time.utc(0) + 11400368.0
=> 0000-05-11 22:46:08 UTC

您可以从这里轻松提取 hour:minutes:seconds。