2012-05-01 7 views
5

¿Por qué las siguientes diferencias?Ecuación de fecha Ruby no devuelve el valor de verdad esperado

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

¿Qué devuelve 'Time.now.end_of_day.to_s == Time.now.end_of_day.to_s - ((1 - 1) * 7) .days.to_s' return than? O tal vez 'Time.now.end_of_day.to_s == (Time.now.end_of_day - ((1 - 1) * 7) .days) .to_s' –

+0

@Phrogz, eso no lo soluciona. Creo que Jorge tiene razón, tienes que usar 'to_i'. – Mischa

+0

@ Mischa Qué interesante; gracias por corregirme. – Phrogz

Respuesta

4

Debido a que el número de nanosegundos es diferente:

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

Yo personalmente consideraría un error en '# end_of_day'. Existen nanosegundos, claro, pero si end_of_day está a unos pocos nanosegundos del final del día, entonces no es, ermm, al final del día;) – d11wtq

+1

Pero cuando resta 0.days de él, está aún más lejos del final del día. Entonces, si hay un error, es más bien en 'días' que en' end_of_day'. – Mischa

3

Como Mischa dijo, los tiempos difieren en nanosegundos. Here es un artículo sobre soluciones y soluciones para hacer esto en Rails, específicamente para pruebas como las que está haciendo.

El enfoque aparentemente más sencillo es redondear los tiempos a segundos al agregar .to_i, pero hay otras alternativas.

2

Para ampliar la respuesta de Mischa:

Desde el docs on the Time object: "Todos los horarios pueden tener fracción Sea consciente de este hecho al comparar veces con cada uno de otros tiempos que aparentemente son iguales cuando se muestra puede ser diferente si se compara.. "

Así que su primer cálculo compara dos objetos Time, que son diferentes en el nivel nanosegundo, pero su segundo cálculo convierte ambos objetos Time en Strings, que ignora los nanosegundos y devuelve true porque ambas representaciones String coinciden.

Cuestiones relacionadas