Perché le seguenti differenze sono diverse?Equazione data rubino che non restituisce il valore di verità atteso
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
Perché le seguenti differenze sono diverse?Equazione data rubino che non restituisce il valore di verità atteso
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
Poiché il numero di nanosecondi è diverso:
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
Personalmente considererei un errore in # # end_of_day'. I nanosecondi esistono, certo, ma se end_of_day è di pochi nanosecondi dalla fine della giornata, allora non è, ermm, la fine della giornata;) – d11wtq
Ma quando sottrai 0.days da esso, è ancora più lontano dalla fine della giornata. Quindi se c'è un bug è piuttosto in 'days' che in 'end_of_day'. – Mischa
Come Mischa detto, i tempi differiscono di nanosecondi. Here è un articolo su soluzioni alternative e correzioni per farlo in Rails, in particolare per test come quello che stai facendo.
L'approccio apparentemente più semplice fornito è quello di arrotondare i tempi a secondi aggiungendo .to_i
, ma ci sono altre alternative.
Ad ampliare la risposta di Mischa:
Dalla docs on the Time object: "Tutti gli orari possono avere frazione Essere consapevoli di questo fatto quando si confrontano i tempi con l'altro volte che sono apparentemente uguali quando visualizzata può essere diversa rispetto.. "
Quindi il tuo primo calcolo confronta due oggetti Tempo, che sono diversi a livello di nanosecondi, ma il tuo secondo calcolo converte entrambi gli oggetti Tempo in Stringhe, che ignora i nanosecondi e restituisce vero perché entrambe le rappresentazioni String corrispondono.
Cosa restituisce "Time.now.end_of_day.to_s == Time.now.end_of_day.to_s - ((1 - 1) * 7) .days.to_s' di ritorno? O forse "Time.now.end_of_day.to_s == (Time.now.end_of_day - ((1 - 1) * 7) .days) .to_s' –
@Phrogz, che non risolve il problema. Penso che Jorge abbia ragione, devi usare 'to_i'. – Mischa
@Mischa Che interessante; grazie per avermi corretto – Phrogz