2013-02-28 6 views
6

rubino 1.9.3dev (2011-09-23 revisione 33323) [i686-linux]Rails sui valori oggetto Date restituiti da date.end_of_day.to_datetime e date.to_datetime.end_of_day rispetto ritorna falsi

Rotaie 3.0.20

recente perché si lavora su un progetto su RSpecs legati alla DateTime on Rails ho scoperto che in una determinata data i valori emessi dai seguenti dichiarazioni

date.end_of_day.to_datetime 

e

date.to_datetime.end_of_day 

rispetto restituisce false se rappresentassero identica data-ora.

A conferma di ciò ho aperto Rails console e provato dopo

1.9.3dev :053 > monday = Time.now.monday 
    => 2013-02-25 00:00:00 +0530 

    1.9.3dev :054 > monday.class 
    => Time 

    1.9.3dev :055 > d1 = monday + 1.hour 
    => 2013-02-25 01:00:00 +0530 

    1.9.3dev :056 > d2 = monday + 1.hour 
    => 2013-02-25 01:00:00 +0530 

    1.9.3dev :058 > d1_eod_datetime = d1.end_of_day.to_datetime 
    => Mon, 25 Feb 2013 23:59:59 +0530 

    1.9.3dev :059 > d2_eod_datetime = d2.to_datetime.end_of_day 
    => Mon, 25 Feb 2013 23:59:59 +0530 

    1.9.3dev :061 > d1_eod_datetime == d2_eod_datetime 
    => false 

    1.9.3dev :062 > d3_eod_datetime = d2.to_datetime.end_of_day 
    => Mon, 25 Feb 2013 23:59:59 +0530 

    1.9.3dev :063 > d2_eod_datetime == d3_eod_datetime 
    => true 

e sembra mia osservazione sembra correct.That è:

Quando d1_eod_datetime e d2_eod_datetime sono confrontati è restituisce false

Quando d2_eod_datetime e d3_eod_datetime sono compa rossi IT rendimenti veri

Sembra un comportamento incoerente per me, però saremmo grati se qualcuno può farmi capire cosa sta succedendo dietro le quinte e il motivo per cui le confronti effettuati sui valori utilizzando date.end_of_day. to_datetime e data.to_datetime.end_of_day non riesce anche se la data data oggetto rappresenta la data identica.

Grazie,

Jignesh

+0

Vedere la domanda correlata: http://stackoverflow.com/questions/8763050/how-to-compare-time-in-ruby – kristinalim

risposta

2

Sebbene loro rappresentazioni di stringa sono uguali, non è uguale d1_eod_datetimed2_eod_datetime. Differiscono nei loro bit meno significativi. Se di convertire i datetimes ad una rappresentazione galleggiante, si può vedere che non sono uguali:

d1_eod_datetime.to_f 
=> 1381788000.0 
d2_eod_datetime.to_f 
=> 1381787999.0 

Il problema si verifica quando l'istanza Time riceve il messaggio end_of_day. Il passaggio del messaggio end_of_day all'istanza Time restituisce un'istanza DateTime. La conversione in DateTime potrebbe comportare una perdita di precisione e la nuova istanza DateTime potrebbe non essere esattamente uguale all'istanza originale Time.

Problemi correlati