如何在ruby中比较时间
我需要使用时间对象作为int(TimeObject.to_I) 然后我需要把一个整数转换回一个时间,与原始时间进行比较。 简短的例子如何在ruby中比较时间,ruby,time,Ruby,Time,我需要使用时间对象作为int(TimeObject.to_I) 然后我需要把一个整数转换回一个时间,与原始时间进行比较。 简短的例子 t1 = Time.now t2 = Time.at(t1.to_i) puts t1 == t2 # Says False puts t1.eql?(t2) # Says False 为什么说这是假的? 当我打印两个时间对象时,显示的是相同的内容D: puts t1 #shows : 2012-01-06 16:01:53
t1 = Time.now
t2 = Time.at(t1.to_i)
puts t1 == t2 # Says False
puts t1.eql?(t2) # Says False
为什么说这是假的?
当我打印两个时间对象时,显示的是相同的内容D:
puts t1 #shows : 2012-01-06 16:01:53 -0300
puts t2 #shows : 2012-01-06 16:01:53 -0300
puts t1.to_a.to_s #shows : [ 53, 1, 16, 6, 1, 2012, 5, 6, true, "CLST"]
puts t2.to_a.to_s #shows : [ 53, 1, 16, 6, 1, 2012, 5, 6, true, "CLST"]
它们是一样的D:但是当试图与==或eql进行比较时?说他们是不同的
(很抱歉我的英语不好)回答
说明:
eql?(其他时间)
如果time和other_time都是具有相同秒数和分数秒数的时间对象,则返回true
链接:
因此,很明显,在执行#to_i
时,几秒钟的时间被删除,然后恢复的时间与原始时间不完全相同。但如果我们恢复两个副本,它们将是相等的
有人可能会想,“嘿,让我们用#来
!”。但是,令人惊讶的是,结果是一样的!可能是因为舍入错误或浮点比较,不确定
备选答案
不要将整数转换回时间进行比较。将原始时间转换为整数
t1 = Time.now
t2 = Time.at(t1.to_i)
puts t1 # 2012-01-06 23:44:06 +0400
puts t2 # 2012-01-06 23:44:06 +0400
t1int, t2int = t1.to_i, t2.to_i
puts t1int == t2int # true
puts t1int.equal?(t2int.to_i) # true
puts t1int.eql?(t2int) # true
第四个测试是
t1==t1
,你的意思是把t1==t2
?否则,您的结果将反映OP所说的内容。最好在时间
对象上使用to_f
to_f
保留小数秒。另一件需要注意的事情是,如果时间对象是使用不同的时间源获得的,那么比较微小的一秒是不明智的。令人惊讶的是,结果是相同的,t1!=t2
:纳闷地说:@SergioTulentsev我完全同意。我会做t1.to_f==t2.to_f,因为这确保了它们之间的数值比较。底层C代码先比较秒,然后比较微秒。@Nick:最好不要这样比较浮点数。建议与ε比较(t1.to\u f在(t2.to\u f)
的(0.0001)范围内)。我不确定这条建议是否适用于Ruby(因为它有“本机”的大数字等等),但对于C这样的语言也是如此。
t1 = Time.now
t2 = Time.at(t1.to_i)
puts t1 # 2012-01-06 23:44:06 +0400
puts t2 # 2012-01-06 23:44:06 +0400
t1int, t2int = t1.to_i, t2.to_i
puts t1int == t2int # true
puts t1int.equal?(t2int.to_i) # true
puts t1int.eql?(t2int) # true