Ruby中的DateTime比较和数学

时间:2016-01-08 19:00:50

标签: ruby datetime comparison

我正在尝试编写一个类来使用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的正确格式出现?

1 个答案:

答案 0 :(得分:0)

您可以使用Time库,然后使用额外的方法扩展默认的Time类,例如#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

您可以从这里轻松提取小时:分钟:秒。