Come posso trovare il numero di giorni tra due oggetti Date in Ruby?


141

Come posso trovare il numero di giorni tra due oggetti Date?

Risposte:


170

Sottrai la data di inizio dalla data di fine:

endDate - beginDate 

2
pensi che intendi sottrarre la data di inizio dalla data di fine :)
Nader

99
tipo di anticlimatica eh?
Brig

18
nota: se si utilizza Wirble in irb (per colorare l'output) il numero razionale avrà un 1 concatenato fino alla fine. yikes! potresti voler usare to_i per convertire il risultato in un numero intero
jwal

9
Se hai un DateTimeoggetto, assicurati di convertirlo per Dateprimo, altrimenti restituisce il numero di secondi (suppongo).
Joshua Muheim,

44
nota anche che la sottrazione di due Dateoggetti ti dà un oggetto Rationalche potresti aver bisogno di digitare in un numero intero, come con(endDate - beginDate).to_i
MusikAnimal

98
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.


53

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 

29

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 

21

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 .countappuntamenti tra oggi e oggi restituirà 0.


Questa è un'ottima risposta, se beginDate è più vecchio di endDate, tornerà 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.
Emmanuel B

8

Questo ha funzionato per me:

(endDate - beginDate).to_i


6

tutti questi mi hanno guidato al risultato corretto, ma ho finito per farlo

DateTime.now.mjd - DateTime.parse("01-01-1995").mjd

Un bocconcino da sottolineare: DateTime.parse in Ruby prevede che la data venga indicata come GG / MM / AAAA o GG-MM-AAAA. Come americano, mi butta sempre via!
rickumali,

15
@rickumali Come membro del resto del mondo, ringrazio Ruby per aver utilizzato il "nostro" formato di data predefinito.
Claudio Holanda,

7
@rickumali Ruby accetta anche la data in YYYY-MM-DDformato, che è comunque ciò che tutti dovrebbero usare.
user513951

1

giorni = (endDate - beginDate) / (60 * 60 * 24)


5
La data è in termini di giorni, quindi non è necessario farlo. Penso che la tua soluzione diventi pertinente con le differenze di DateTime.
suga_shane,

1

Bene, abbi cura di cosa intendi anche per "tra" ...

days_apart = (to - from).to_i     # from + days_apart = to
total_days = (to - from).to_i + 1 # number of "selected" days
in_between_days = (to - from).to_i - 1 # how many days are in between from and to, i.e. excluding those two days
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.