2016-01-08 25 views
0

我试图写一个类做一些数学与日期时间。在实际情况下,我收到DateTime是否是这样的:日期时间比较和数学在Ruby中

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

你看了[Ruby可以打印出时间差(持续时间)吗?](http://stackoverflow.com/questions/1679266/can-ruby-print-out-time-difference-duration-readily)? –

+0

@WandMaker我刚刚看到它,我只是想知道是否有其他方式,比如使用Ruby内置方法或类似方法。但同时我会实施这个课程,看看它是否符合我的需求。谢谢。 –

回答

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 

你可以很容易地从这里提取小时:分钟:秒。

+0

这正是我一直在寻找。像魅力一样工作!谢谢 –