¿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
¿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
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
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
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
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.
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.
¿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' –
@Phrogz, eso no lo soluciona. Creo que Jorge tiene razón, tienes que usar 'to_i'. – Mischa
@ Mischa Qué interesante; gracias por corregirme. – Phrogz