2013-09-04 11 views

risposta

5

E 'il comportamento previsto. Dal docs:

D - Altre → data o razionale

Date.new(2001,2,3) - 1    #=> #<Date: 2001-02-02 ...> 
Date.new(2001,2,3) - Date.new(2001) #=> (33/1) 

Un tipo razionale viene utilizzato perché può esprimere la differenza esattamente:

diff = DateTime.new(2001,2,3) - DateTime.new(2001,2,2,1) 
#=> (23/24) 

Mentre galleggiante impossibile:

diff.to_f 
#=> 0.9583333333333334 
+0

come posso convertire Rational in minuti? –

+1

@AlexanderSupertramp moltiplicare per 1440 (1 giorno = 1440 minuti) – Stefan

2

Because si potrebbe voler trovare una differenza tra due DateTime s, che può essere Rational. Es .:

DateTime.new(2001,2,3) - DateTime.new(2001,2,2,12) 
# ⇒ (1/2) 
+0

Se le due volte sono ** meno di un giorno di distanza ** non importa. Anche per due volte a distanza di anni, è necessaria questa funzione per conoscere la differenza con la ** precisione di meno di un giorno **. – sawa

+0

Ho appena usato un esempio di ruby-doc. – mudasobwa

+0

Non sto menzionando il tuo esempio. Sto menzionando la tua spiegazione. – sawa

0

Perché a volte tale confronto come di seguito sarebbe accaduto:

date_sent = DateTime.parse("2013-01-01 12:00:00") # with half a day 
date_now = Date.today 

days = (date_now - date_sent) # => (491/2) 
2

Anche questo era fonte di confusione.

La differenza tra i giorni è sempre un numero intero, quindi perché esprimerlo come un razionale?

Ecco perché "la solita tipo di ritorno utilizzato per esprimere la differenza tra una data e un DateTime, o due DateTime. In questo modo è possibile esprimere una differenza tra due volta.

Sono personalmente convinto che sia la scelta migliore, per esempio:

Time.now.to_datetime-Date.today 

rendimenti:

=> (44150896597/86400000000) 

E credo che questo era più chiara:

=> 0.5110978639814815