2015-10-14 60 views
2

所以我在使用類別爲Time的對象屬性之一來查找記錄時遇到問題。解析字符串到時間與原始時間不一樣

原來,當我將時間作爲params傳遞給我的控制器時,我的控制器又將其發送給模型...我發送的time對象被串化。

所以我想我只會將其轉換回時間或者通過Time.parse(<stringified time>)<stringified time>.to_time - (使用Rails)

但我的測試失敗保持,所以我決定做一些調查發生了什麼事情在那裏。

這是我發現了什麼:

2.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。這種差異是從哪裏來的?

最重要的是,我該如何讓這兩者相等?非常感謝,所有。

+0

這麼好的問題! – Arsen

回答

2

原因:

由於紅寶石1.9.2,時間實現使用簽名的63位整數, Bignum的或理性的。整數是納秒數自 時代可以代表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 
+0

哇!謝謝,阿森,這讓人大開眼界。然而,看到數據庫自動填充所有這些納米的東西,有沒有什麼辦法可以保留(返回)'nsec'時間從字符串或int轉換回來? –

+0

不可以,因爲如果您將納秒級的時間轉換爲字符串或整數,您將失去此信息,並且將來無法恢復。但是你可以調用'a.to_f'並保存這個浮點數。該浮點數包含秒和納秒,您可以從中恢復時間。 – Arsen

+0

非常感謝。這真的有很大的幫助:) –