【问题标题】:Ruby time operations involving utc涉及 UTC 的 Ruby 时间操作
【发布时间】:2011-11-19 21:50:47
【问题描述】:

为什么这个表达式返回 false?

(Time.now - 10.hours).utc == Time.now.utc - 10.hours

为什么要考虑结果的差异?哪种方式是正确的?

【问题讨论】:

    标签: ruby time utc


    【解决方案1】:

    表达式是等价的,但是当按顺序调用时,不会返回相同的结果。注意:

    Time.now == Time.now #=> false
    Time.now - Time.now #=> Some really small negative number
    

    如果您连续两次拨打Time.now,第二次会在第一次之后发生,对吗?即使是在非常很短的时间之后。

    我不会说任何一种形式都更正确。如果你存储Time.now 并运行相同的比较,你会得到预期的结果。

    t = Time.now
    t.utc = 10.hours == (t - 10.hours).utc #=> true
    

    【讨论】:

    • 很好的答案。感谢您抽出宝贵时间。
    【解决方案2】:

    因为它们不一样。 Rubys Time.now 将时间跟踪到几分之一秒,#to_s 的输出只是没有显示这一点。

    >> Time.now == Time.now
    => false
    >> Time.now.to_i == Time.now.to_i  
    => true
    >> Time.now.to_f == Time.now.to_f
    => false
    

    查看Timehere 的文档。

    【讨论】:

    • 当然,如果你运行的次数足够多,Time.now.to_i == Time.now.to_i 并不总是正确的。
    • 太棒了。感谢您的回复。这就说得通了。我最初的反应是这和系统运行时间有关,但想问问并确定。
    【解决方案3】:
    (Time.now - 10.hours).utc.to_s == (Time.now.utc - 10.hours).to_s ==> true
    
    (Time.now - 10.hours).utc - (Time.now.utc - 10.hours) ==> a small, non-zero
                                                              number. IE -1.3e-05
    

    注意 a_time.to_s 与 a_time.inspect 相同,它只显示最接近秒的时间。但内部分辨率远小于一秒。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多