2012-05-01 54 views
5

爲什麼以下不同?Ruby日期方程未返回預期真值

Time.now.end_of_day  == Time.now.end_of_day - 0.days  # false 
Time.now.end_of_day.to_s == Time.now.end_of_day - 0.days.to_s # true 
+0

什麼'Time.now.end_of_day.to_s == Time.now.end_of_day.to_s - ((1 - 1)* 7).days.to_s' return than?或者'也許'Time.now.end_of_day.to_s ==(Time.now.end_of_day - ((1 - 1)* 7).days).to_s' –

+0

@Progro,那不能解決它。我認爲豪爾赫是對的,你必須使用'to_i'。 – Mischa

+0

@Mischa多麼有趣;感謝您糾正我。 – Phrogz

回答

4

由於納秒數是不同的:

ruby-1.9.2-p180 :014 > (Time.now.end_of_day - 0.days).nsec 
=> 999999000 
ruby-1.9.2-p180 :015 > Time.now.end_of_day.nsec 
=> 999999998 
+1

我個人認爲'#end_of_day'中存在一個錯誤。毫微秒存在,當然,但如果end_of_day是從一天結束幾納秒,那麼它不是,呃,一天結束;) – d11wtq

+1

但是當你從它減去0.天時,它甚至更遠離結尾的一天。所以如果有一個錯誤,它在'天'而不是'end_of_day'。 – Mischa

3

像米沙表示,倍納秒不同。 Here是一篇關於在Rails中完成此工作的解決方法和修復的文章,專門針對您正在執行的測試。

給出的看似最直接的方法是通過追加.to_i將時間舍入到秒,但還有其他選擇。

2

要擴大米莎的回答是:

docs on the Time object:「所有的時間可能有部分相互-時候顯示時相比,可以不同於顯然是相等的比較次的時候要注意這一點。 「

因此,您的第一次計算比較兩個時間對象,它們在納秒級別不同,但第二次計算將兩個時間對象都轉換爲字符串,這會忽略納秒並返回true,因爲兩個字符串表示形式都匹配。