我正在尝试编写一个类来使用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
的正确格式出现?
答案 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
您可以从这里轻松提取小时:分钟:秒。