2013-02-28 70 views
6

紅寶石1.9.3dev(2011-09-23的修訂33323)[i686的Linux的]導軌相比返回false

當由date.end_of_day.to_datetime和date.to_datetime.end_of_day返回Rails的3.0.20

爲什麼最近在一個項目上工作on Rails的有關日期時間RSpecs我發現,在給定日期 通過下面的語句

發出的值

相比
date.to_datetime.end_of_day 

雖然它們表示相同的日期 - 時間返回false。

爲了證實這一點,我打開了Rails的控制檯,並嘗試了以下

1.9.3dev :053 > monday = Time.now.monday 
    => 2013-02-25 00:00:00 +0530 

    1.9.3dev :054 > monday.class 
    => Time 

    1.9.3dev :055 > d1 = monday + 1.hour 
    => 2013-02-25 01:00:00 +0530 

    1.9.3dev :056 > d2 = monday + 1.hour 
    => 2013-02-25 01:00:00 +0530 

    1.9.3dev :058 > d1_eod_datetime = d1.end_of_day.to_datetime 
    => Mon, 25 Feb 2013 23:59:59 +0530 

    1.9.3dev :059 > d2_eod_datetime = d2.to_datetime.end_of_day 
    => Mon, 25 Feb 2013 23:59:59 +0530 

    1.9.3dev :061 > d1_eod_datetime == d2_eod_datetime 
    => false 

    1.9.3dev :062 > d3_eod_datetime = d2.to_datetime.end_of_day 
    => Mon, 25 Feb 2013 23:59:59 +0530 

    1.9.3dev :063 > d2_eod_datetime == d3_eod_datetime 
    => true 

,似乎我的觀察看correct.That是:

d1_eod_datetime和d2_eod_datetime比較它返回false

d2_eod_datetime和d3_eod_datetime是compa紅其返回true

看起來不一致的行爲給我,但是希望如果有人 可以讓我明白是怎麼回事幕後,爲什麼值進行了比較 使用date.end_of_day。 to_datetimedate.to_datetime.end_of_day雖然來源日期對象表示相同的日期時間。

感謝,

Jignesh

+0

查看相關問題:http://stackoverflow.com/questions/8763050/how-to-compare-time-in-ruby – kristinalim 2013-09-21 23:04:30

回答

2

雖然他們的字符串表現是一樣的,d1_eod_datetime不等於d2_eod_datetime。它們的最低有效位不同。如果您轉換您的日期時間爲float表示,你可以看到,他們是不相等的:

d1_eod_datetime.to_f 
=> 1381788000.0 
d2_eod_datetime.to_f 
=> 1381787999.0 

Time實例接收end_of_day消息出現問題。將end_of_day消息傳遞給Time實例會返回DateTime實例。轉換爲DateTime可能會導致精度損失,並且新的DateTime實例可能不完全等於您的原始Time實例。