2012-05-01 27 views
5

Tại sao các điểm sau đây khác nhau?Phương trình ngày tháng của Ruby không trả về giá trị đích thực mong đợi

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' trở lại hơn? Hoặc có thể 'Time.now.end_of_day.to_s == (Time.now.end_of_day - ((1 - 1) * 7) .days) .to_s' –

+0

@Phrogz, điều đó không khắc phục được. Tôi nghĩ Jorge đúng, bạn phải sử dụng 'to_i'. – Mischa

+0

@Mischa Thú vị; Cảm ơn vì đã sửa tôi. – Phrogz

Trả lời

4

Bởi vì số lượng nano giây là khác nhau:

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

Cá nhân tôi xem xét rằng một lỗi trong '# end_of_day'. Nanoseconds tồn tại, chắc chắn, nhưng nếu end_of_day là một vài nano giây từ cuối ngày, sau đó nó không phải, ermm, cuối ngày;) – d11wtq

+1

Nhưng khi bạn trừ 0 ngày từ nó, nó thậm chí còn xa hơn từ cuối trong ngày. Vì vậy, nếu có lỗi, thay vào đó là 'days' thay vì' end_of_day'. – Mischa

3

Giống như Mischa nói, thời gian khác nhau bằng nano giây. Here là một bài viết về cách khắc phục và các bản sửa lỗi để thực hiện việc này trong Rails, đặc biệt cho các thử nghiệm như bạn đang làm.

Cách tiếp cận dường như đơn giản nhất được đưa ra là làm tròn số lần thành giây bằng cách thêm .to_i, nhưng có các lựa chọn thay thế khác.

2

Mở rộng trên Mischa của câu trả lời:

Từ docs on the Time object: "Tất cả thời gian có thể có phần Nhận thức được thực tế này khi so sánh thời gian với nhau, lần đó là rõ ràng bằng khi được hiển thị có thể khác nhau khi so sánh.. " Vì vậy, phép tính đầu tiên của bạn so sánh hai đối tượng Thời gian khác nhau ở cấp độ nano giây, nhưng phép tính thứ hai của bạn chuyển đổi cả hai đối tượng Thời gian thành Chuỗi, bỏ qua nano giây và trả về true vì cả hai biểu diễn Chuỗi khớp nhau.

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