2010-12-21 36 views

Respuesta

140

Restar la fecha de inicio de la fecha de finalización:

endDate - beginDate 
+2

que te refieres resta la fecha de inicio de la fecha de finalización :) – Nader

+74

especie de anticlímax eh? – Brig

+17

nota: si está utilizando Wirble en irb (para colorear el resultado), el número racional tendrá un 1 concatenado hasta el final. ¡Ay!es posible que desee usar to_i para convertir el resultado en un número entero – jwal

5

Prueba esto:

num_days = later_date - earlier_date 
88
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 

Este utiliza un Modified Julian Day Number.

De wikipedia:

La fecha juliana (JD) es el intervalo de tiempo en días y fracciones de días desde el 1 de enero de 4713 aC Greenwich mediodía, Julian calendario proléptico.

4

todo esto me condujo a un resultado correcto, pero terminaron haciendo

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

Un tidbit para señalar: DateTime.parse en Ruby espera que la fecha se proporcione como DD/MM/YYYY, o DD-MM-YYYY. Como estadounidense, ¡siempre me despista! – rickumali

+12

@rickumali Como miembro del resto del mundo, agradezco a Ruby por usar "nuestro" formato de fecha predeterminado. –

+6

@rickumali Ruby también acepta la fecha en el formato 'YYYY-MM-DD', que es lo que todos deben usar de todos modos. –

40

Esto puede haber cambiado en Ruby 2.0

Cuando hago esto consigo una fracción. Por ejemplo en la consola (ya sea IRB o carriles 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) 

Por supuesto, echando a un int dar el resultado esperado

2.0.0-p195 :009 > (a_date-b_date).to_i 
=> 15 

Esto también funciona para objetos DateTime, pero hay que tener en consideración los segundos, como este ejemplo

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 
20

en Ruby 2.1.3 cosas han cambiado:

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

días = (endDate - beginDate)/(60 * 60 * 24)

+5

La fecha es en términos de días, por lo que no es necesario que haga esto. Creo que su solución se vuelve relevante con las diferencias de DateTime. –

5

¿Qué tal esto?

(beginDate...endDate).count 

The Range es un conjunto de seriales únicos. Y ... es un literal de rango exclusivo.

Así beginDate..(endDate - 1) es lo mismo. Excepto que no.

En caso cuando BeginDate es igual a endDate, primer elemento será excluido debido a la singularidad y ... excluirá último. Así que si queremos .count fechas entre hoy y hoy volverá 0.

+0

@TobySpeight ok, la respuesta fue editada – mpugach

+0

¡Respuesta perfecta! – sidney

2

Esto funcionó para mí:

(endDate - beginDate).to_i 
Cuestiones relacionadas