2013-02-28 24 views
6

ruby ​​1.9.3dev (2011/09/23 sửa đổi 33.323) [i686-linux]Rails trên các giá trị đối tượng ngày trở lại bởi date.end_of_day.to_datetime và date.to_datetime.end_of_day khi so sánh lợi nhuận sai

ray 3.0.20

Gần đây tại sao làm việc trên một dự án trên RSpecs liên quan đến DateTime on Rails tôi phát hiện ra rằng vào một ngày cụ các giá trị phát ra bởi câu sau đây

date.end_of_day.to_datetime 

date.to_datetime.end_of_day 

khi so sánh trở sai dù họ đại diện giống hệt ngày thời gian.

Để khẳng định điều này tôi đã mở ra Rails giao diện điều khiển và cố gắng ra sau

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 

và có vẻ như quan sát của tôi trông correct.That là:

Khi d1_eod_datetime và d2_eod_datetime được so sánh nó trả về false

Khi d2_eod_datetime và d3_eod_datetime là compa đỏ nó trả về true

Nó trông giống như một hành vi không phù hợp với tôi, tuy nhiên sẽ đánh giá cao nếu ai cũng có thể làm cho tôi hiểu những gì đang xảy ra đằng sau hậu trường và tại sao so sánh được thực hiện trên các giá trị sử dụng date.end_of_day. to_datetimedate.to_datetime.end_of_day không thành công mặc dù nguồn ngày đối tượng đại diện cho ngày giờ giống nhau.

Cảm ơn,

Jignesh

+0

Xem câu hỏi liên quan: http://stackoverflow.com/questions/8763050/how-to-compare-time-in-ruby – kristinalim

Trả lời

2

Mặc dù đại diện chuỗi của họ đều giống nhau, d1_eod_datetime không bằng d2_eod_datetime. Chúng khác nhau về các bit ít quan trọng nhất của chúng. Nếu bạn chuyển đổi datetimes của bạn đến một đại diện phao, bạn có thể thấy rằng họ không bình đẳng:

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

Vấn đề xảy ra khi dụ Time nhận được thông báo end_of_day. Chuyển thông báo end_of_day tới phiên bản Time trả về phiên bản DateTime. Việc chuyển đổi thành DateTime có thể dẫn đến mất tính chính xác và phiên bản DateTime mới có thể không chính xác tương đương với phiên bản Time gốc của bạn.

Các vấn đề liên quan