解析字符串到时间与原始时间不同

时间:2015-10-14 20:21:54

标签: ruby-on-rails ruby

所以我通过使用类Time之一的object属性来查找记录时遇到了问题。

事实证明,当我将params作为time传递给我的控制器时,控制器又将其发送给模型......我发送的Time.parse(<stringified time>)对象会被字符串化。

所以我想我会通过<stringified time>.to_time2.2.0 :003 > a = Time.now => 2015-10-14 20:50:19 +0100 2.2.0 :004 > b = a.to_s => "2015-10-14 20:50:19 +0100" 2.2.0 :005 > c = Time.parse b => 2015-10-14 20:50:19 +0100 2.2.0 :006 > c == a => false 2.2.0 :007 > a.class => Time 2.2.0 :008 > c.class => Time 2.2.0 :015 > a - c => 0.951439 2.2.0 :016 > d = b.to_time => 2015-10-14 20:50:19 +0100 2.2.0 :017 > c - d => 0.0 - (使用导轨)将其转换回时间

但我的测试仍然失败,所以我决定去看看那里发生了什么。

这是我发现的:

a - c

我的困惑主要来自:0.951439给了我<textarea>。这种差异来自哪里?

最重要的是,我如何让这两者相等?非常感谢,所有。

1 个答案:

答案 0 :(得分:2)

原因:

  

自Ruby 1.9.2起,Time实现使用带符号的63位整数,   Bignum或Rational。整数是纳秒数,因为   可以代表1823-11-12到2116-02-20的时代。当Bignum或   使用Rational(在1823之前,在2116之后,在纳秒之下),时间   使用整数时效果较慢。

如果你运行a = Time.now,你的纪元加上 P纳秒就会有N秒。但是当你运行Time.parse b时,你的数字秒数相同但纳秒。这就是你要找的东西。

Loading development environment (Rails 4.2.4)
[1] pry(main)> a = Time.now
=> 2015-10-14 23:41:12 +0300
[2] pry(main)> a.nsec
=> 733355000
[3] pry(main)> Time.parse(a.to_s).nsec
=> 0

所以你必须避免这种纳米的东西。例如,你可以这样写:

[16] pry(main)> a = Time.at(Time.now.to_i)
=> 2015-10-14 23:47:59 +0300
[17] pry(main)> a.nsec
=> 0