2012-05-01 10 views
5

Dlaczego występują następujące różnice?Równanie daty Rubiego nie zwraca oczekiwanej wartości prawdy

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

Co oznacza "Time.now.end_of_day.to_s == Time.now.end_of_day.to_s - ((1 - 1) * 7) .days.to_s' return than? A może 'Time.now.end_of_day.to_s == (Time.now.end_of_day - ((1 - 1) * 7) .days) .to_s' –

+0

@Phrogz, który tego nie naprawi. Myślę, że Jorge ma rację, musisz użyć 'to_i'. – Mischa

+0

@Mischa Jak interesujące; dzięki za poprawienie mnie. – Phrogz

Odpowiedz

4

Ponieważ liczba nanosekund jest inna

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

Osobiście uważam, że błąd w '# end_of_day'. Nanosekundy istnieją, oczywiście, ale jeśli end_of_day jest kilka nanosekund od końca dnia, to nie jest, ermm, koniec dnia;) – d11wtq

+1

Ale kiedy odejmie się od niego 0.days, to jest nawet dalej od końca dnia. Więc jeśli jest błąd, to raczej w "dniach" niż w 'end_of_day'. – Mischa

3

jak Mischa że czasy różnią się nanosekund. Here to artykuł o obejściach i poprawkach do zrobienia tego w Railsach, specjalnie do testów takich jak Ty.

Z pozornie najprostszym podejściem jest zaokrąglenie czasów do sekund przez dodanie .to_i, ale są też inne alternatywy.

2

Aby rozwinąć na Mischa za odpowiedź:

Z docs on the Time object: „Czasy mogą mieć frakcję Bądź świadomy tego faktu przy porównywaniu razy ze sobą czasy, które są pozornie równe, gdy wyświetlane mogą być różne w porównaniu.. "

W ten sposób pierwsze obliczenia porównują dwa obiekty Time, które różnią się na poziomie nanosekundy, ale drugie obliczenie przekształca oba obiekty Time w ciągi, które ignorują nanosekundy i zwracają wartość true, ponieważ obie reprezentacje String są zgodne.

Powiązane problemy