如何在ruby中比较时间

如何在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

我需要使用时间对象作为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 -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