2012-05-01 8 views
5

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 
+0

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' –

+0

@Phrogz, che non risolve il problema. Penso che Jorge abbia ragione, devi usare 'to_i'. – Mischa

+0

@Mischa Che interessante; grazie per avermi corretto – Phrogz

risposta

4

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 
+1

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

+1

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

3

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.

2

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.

Problemi correlati