Come posso trovare il numero di giorni tra due oggetti Date?
Come posso trovare il numero di giorni tra due oggetti Date?
Risposte:
Sottrai la data di inizio dalla data di fine:
endDate - beginDate
DateTime
oggetto, assicurati di convertirlo per Date
primo, altrimenti restituisce il numero di secondi (suppongo).
Date
oggetti ti dà un oggetto Rational
che potresti aver bisogno di digitare in un numero intero, come con(endDate - beginDate).to_i
irb(main):005:0> a = Date.parse("12/1/2010")
=> #<Date: 4911063/2,0,2299161>
irb(main):007:0> b = Date.parse("12/21/2010")
=> #<Date: 4911103/2,0,2299161>
irb(main):016:0> c = b.mjd - a.mjd
=> 20
Questo utilizza un numero di giorno giuliano modificato .
Da Wikipedia :
La data giuliana (JD) è l'intervallo di tempo in giorni e frazioni di un giorno dal 1 ° gennaio 4713 aC mezzogiorno di Greenwich, calendario prolettico giuliano.
Questo potrebbe essere cambiato in Ruby 2.0
Quando lo faccio ottengo una frazione. Ad esempio sulla console (irb o rails c)
2.0.0-p195 :005 > require 'date'
=> true
2.0.0-p195 :006 > a_date = Date.parse("25/12/2013")
=> #<Date: 2013-12-25 ((2456652j,0s,0n),+0s,2299161j)>
2.0.0-p195 :007 > b_date = Date.parse("10/12/2013")
=> #<Date: 2013-12-10 ((2456637j,0s,0n),+0s,2299161j)>
2.0.0-p195 :008 > a_date-b_date
=> (15/1)
Ovviamente, lanciare su un int dà il risultato atteso
2.0.0-p195 :009 > (a_date-b_date).to_i
=> 15
Questo funziona anche per gli oggetti DateTime, ma devi prendere in considerazione i secondi, come questo esempio
2.0.0-p195 :017 > a_date_time = DateTime.now
=> #<DateTime: 2013-12-31T12:23:03-08:00 ((2456658j,73383s,725757000n),-28800s,2299161j)>
2.0.0-p195 :018 > b_date_time = DateTime.now-20
=> #<DateTime: 2013-12-11T12:23:06-08:00 ((2456638j,73386s,69998000n),-28800s,2299161j)>
2.0.0-p195 :019 > a_date_time - b_date_time
=> (1727997655759/86400000000)
2.0.0-p195 :020 > (a_date_time - b_date_time).to_i
=> 19
2.0.0-p195 :021 > c_date_time = a_date_time-20
=> #<DateTime: 2013-12-11T12:23:03-08:00 ((2456638j,73383s,725757000n),-28800s,2299161j)>
2.0.0-p195 :022 > a_date_time - c_date_time
=> (20/1)
2.0.0-p195 :023 > (a_date_time - c_date_time).to_i
=> 20
In Ruby 2.1.3 le cose sono cambiate:
> endDate = Date.new(2014, 1, 2)
=> #<Date: 2014-01-02 ((2456660j,0s,0n),+0s,2299161j)>
> beginDate = Date.new(2014, 1, 1)
=> #<Date: 2014-01-01 ((2456659j,0s,0n),+0s,2299161j)>
> days = endDate - beginDate
=> (1/1)
> days.class
=> Rational
> days.to_i
=> 1
Cosa ne pensi di questo?
(beginDate...endDate).count
La gamma è un insieme di serial unici. Ed ...
è un esclusivo Range letterale.
Così beginDate..(endDate - 1)
è lo stesso. Tranne che non lo è.
Nel caso in cui beginDate sia uguale a endDate , il primo elemento sarà escluso a causa dell'unicità ed ...
escluderà l'ultimo. Quindi, se vogliamo .count
appuntamenti tra oggi e oggi restituirà 0.
0
, il che funziona perfettamente su alcuni casi. Inoltre, se le due date sono uguali, restituirà 0. Restituisce anche un intero semplice. Altre risposte devono essere trasformate in numeri interi o potrebbe essere necessario tradurre in 0 se il risultato è negativo.
Prova questo:
num_days = later_date - earlier_date
tutti questi mi hanno guidato al risultato corretto, ma ho finito per farlo
DateTime.now.mjd - DateTime.parse("01-01-1995").mjd
YYYY-MM-DD
formato, che è comunque ciò che tutti dovrebbero usare.
giorni = (endDate - beginDate) / (60 * 60 * 24)