Problema al restar fechas

saludos muchachos tengo un problema al restar 2 fechas estoy realizando
la siguiente operacion

((fecha_1 - fecha_2)/86400).to_i para saber cuantos dias hay entre
fecha1 y fecha2 estaba introduciendo la fecha 10/6/2009 y la fecha
13/6/2009 y me estan dando 2 dias cosa que no es cierta que puedo
hacer??

gracias por su tiempo

fecha1 = “10/06/2009”
fecha2 = “13/06/2009”

puts fecha2.to_i - fecha1.to_i

sale 3 :slight_smile:

El 10 de junio de 2009 15:50, Jesus
Marval[email protected]
escribió:> saludos muchachos tengo un problema al restar 2 fechas estoy realizando

chamo no me funciona, yo estoy leyendo esas fechas de una base de datos,
y las estoy operando como mostre, trate de darle un formato de fecha con
strftime pero no funciona =S

Cuidado, no sé si José Antonio bromea, pero si sale 3 es por pura
casualidad!!

String#to_i deja de parsear cuando encuentra algo que no es un número,
así que “10/06/2009”.to_i = 10 y “13/06/2009”.to_i = 13, así que
sí,sale 3, que es lo correcto, pero sólo mientras ambas fechas estén en
el mismo mes del mismo
año.
En cuanto a la pregunta original, si las variables son de tipo Date,
la resta sale correcta:

irb(main):001:0> (Date.parse(“2009-06-13”) -
Date.parse(“2009-06-10”)).to_i
=> 3

2009/6/10 Jose Antonio R. [email protected]:

[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es


Sergio Gil Pérez de la Manga
e-mail > [email protected]
blog > http://www.lacoctelera.com/porras
now > http://twitter.com/porras

Tienes que estar haciendo algo mal. Mira:

fecha1 = Date.parse(‘2009/06/10’)
=> #<Date: 4909985/2,0,2299161>

fecha2 = Date.parse(‘2009/06/13’)
=> #<Date: 4909991/2,0,2299161>

fecha2 - fecha1
=> Rational(3, 1) # Es decir, 3

dt1 = DateTime.parse(‘2009/06/10T00:00:00’)
=> #<DateTime: 4909985/2,0,2299161>

dt2 = DateTime.parse(‘2009/06/13T00:00:00’)
=> #<DateTime: 4909991/2,0,2299161>

dt2 - dt1
=> Rational(3, 1) # De nuevo 3

Y continuando con el ejemplo anterior:

dt1 = DateTime.parse(‘2009/06/10T09:30:00’)
=> #<DateTime: 117839659/48,0,2299161>

dt2 - dt1
=> Rational(125, 48)

(dt2 - dt1).to_f
=> 2.60416666666667

(dt2 - dt1).to_i
=> 2

Que es posiblemente la razón por la que a tí te salen 2 días. Cuando
operas con fechas hay que tener cuidado de que sean Date y no DateTime
con una hora diferente a las 00.00.

Ampliando mi respuesta:

Si son Time (que me parece que es tu caso, al ver esa división), en
principio también funciona:

irb(main):001:0> (Time.local(2009, 6, 13, 0, 0, 0) - Time.local(2009,
6, 10, 0, 0, 0)) / 86400
=> 3.0

Yo he puesto las 0:00 en ambos casos; el problema es si en ambas
variables la hora del día no es la misma (lo cual es perfectamente
posible). Mira que pasa si pongo las 2:00 del día 10 y la 1:00 del
día13

irb(main):002:0> (Time.local(2009, 6, 13, 1, 0, 0) - Time.local(2009,
6, 10, 2, 0, 0)) / 86400
=> 2.95833333333333

Efectivamente: son “casi” tres días. Como estás haciendo un .to_i, pues eso:

irb(main):003:0> (2.95833333333333).to_i
=> 2

2009/6/10 Sergio Gil Pérez de la Manga [email protected]:

Marval[email protected] escribió:

saludos muchachos tengo un problema al restar 2 fechas estoy realizando



Sergio Gil Pérez de la Manga
e-mail > [email protected]
blog > http://www.lacoctelera.com/porras
now > http://twitter.com/porras


Sergio Gil Pérez de la Manga
e-mail > [email protected]
blog > http://www.lacoctelera.com/porras
now > http://twitter.com/porras

Depende.

Lo ideal sería que, si vas a tratar ese dato como una fecha, lo
tuvieras en base de datos como fecha, así no tendrías este problema
(ni varios otros, por cierto).

Si, en cambio, en otras partes de la aplicación lo estás tratando como
fecha y hora, pero aquí lo quieres expresar como días, simplemente
réstalas (como hacías originalmente) pero en vez de usar .to_i usa
.round que no redondea hacia abajo sino hacia el entero más cercano.

P.D.: No abras hilos nuevos para tratar el mismo tema, contesta al
mismo.

2009/6/10 Jesus M. [email protected]:


Sergio Gil Pérez de la Manga
e-mail > [email protected]
blog > http://www.lacoctelera.com/porras
now > http://twitter.com/porras

bueno creo que justamente ese es mi problema las fechas vienen en
timestamp, ese date parse convierte un string en formato date correcto,
podria pasar las fechas de la bd por un strftime y luego hacer el parse
correcto?

aunque igual no es lo que necesitas, tan sólo añadir que si en algún
momento
necesitases las fechas comprendidas en un intervalo dado, puedes
utilizar
los rangos de ruby:

fecha1 = Date.parse(‘2009-06-10’)
fecha2 = Date.parse(‘2009-06-13’)
(fecha1…fecha2).to_a => [#<Date: 4909985/2,0,2299161>, #<Date:
4909987/2,0,2299161>, #<Date: 4909989/2,0,2299161>, #<Date:
4909991/2,0,2299161>]

símplemente elegante

saludos

2009/6/10 Daniel R. Troitiño [email protected]