【问题标题】:How to compare Time in ruby如何比较红宝石中的时间
【发布时间】:2012-02-04 11:46:03
【问题描述】:

我需要使用 Time 对象作为 int (TimeObject.to_i) 然后我需要将一个 int 转换回一个时间,以与原始时间进行比较。 简短的例子

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 进行比较时?说他们不同 (对不起我的英语不好)

【问题讨论】:

    标签: ruby time


    【解决方案1】:

    回答

    t1 = Time.now
    t2 = Time.at(t1.to_i)
    t3 = Time.at(t1.to_i)
    puts t1  # 2012-01-06 23:09:41 +0400
    puts t2  # 2012-01-06 23:09:41 +0400
    puts t3  # 2012-01-06 23:09:41 +0400
    
    puts t1 == t2      # false
    puts t1.equal?(t2) # false
    puts t1.eql?(t2)   # false
    
    puts t2.equal? t3  # false
    puts t2.eql? t3    # true
    puts t2 == t3      # true
    

    解释:

    eql?(other_time)

    如果 time 和 other_time 都是具有相同秒数和小数秒数的 Time 对象,则返回 true。

    链接:Time#eql?

    因此,显然,执行#to_i 时会减少几分之一秒,然后恢复的时间与原始时间不完全相同。但是如果我们恢复两个副本,它们将是相等的。

    有人可能会想,“嘿,那我们就用#to_f吧!”。但是,令人惊讶的是,结果是一样的!可能是因为舍入错误或者浮点比较,不确定。

    备选答案

    不要将整数转换回时间进行比较。将原始时间转换为 int!

    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 所说的内容。
    • 在Time 对象上使用to_f 会更好; to_f 保留小数秒。需要注意的另一件事是,如果 Time 对象是使用不同的时间源获得的,那么比较微小的几分之一秒是不明智的。
    • 令人惊讶的是,结果是一样的,t1 != t2。 :困惑:
    • @SergioTulentsev 我完全同意。我会做 t1.to_f == t2.to_f 因为这样可以确保它们之间的数值比较。底层 C 代码比较时间(以秒为单位,然后是微秒)。
    • @Nick:最好不要像这样比较浮点数。建议与 epsilon (t1.to_f is_within(0.0001).of(t2.to_f)) 进行比较。我不确定这个建议是否仍然适用于 Ruby(因为它有“原生”大数字等等),但对于像 C 这样的语言来说确实如此。
    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多