Foros del Web » Programando para Internet » PHP »

Restar 2 fechas (pero sin la hora)

Estas en el tema de Restar 2 fechas (pero sin la hora) en el foro de PHP en Foros del Web. Es que si resto con los timestamp de las fechas al restar por ejemplo "27/11/2010 23:05:10" menos "30/11/2010 01:24:21" no me devuelve que hay 3 ...
  #1 (permalink)  
Antiguo 11/03/2010, 11:35
Avatar de mdromed  
Fecha de Ingreso: septiembre-2009
Mensajes: 389
Antigüedad: 14 años, 7 meses
Puntos: 8
Pregunta Restar 2 fechas (pero sin la hora)

Es que si resto con los timestamp de las fechas al restar por ejemplo "27/11/2010 23:05:10" menos "30/11/2010 01:24:21" no me devuelve que hay 3 dias de diferencia entre ambas, sino que devuelve un timestamp correspondiente a 2dias, 22 horas, 26 minutos, ....

Y yo lo que quiero es que me diga que hay "2 dias" de difrencia entre esas 2 fechas.

He pasado directamente los 2 timestamps a formato fecha sin hora con
Date("d/m/Y") y las he restado sin mas y funciona, pero me parece un poco cutre una resta así a pelo entre 2 fechas pq no quiero tener problemas de compatibilidad con versiones antiguas de php.

¿Hay alguna otra manera de hacerlo con alguna funcion o algo?

Muchas gracias
  #2 (permalink)  
Antiguo 11/03/2010, 11:51
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Restar 2 fechas (pero sin la hora)

Mira este post a ver si te ayuda http://www.forosdelweb.com/f18/funci...ificar-717791/
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 11/03/2010, 12:00
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Restar 2 fechas (pero sin la hora)

te dejo un ejemplo de una fecha inicial con la fecha de hoy: (solo tendrias que aumentarle las horas al tiemstamp)

Código PHP:
$fecha_expiracion="2009-09-20";

$cad_fecha=explode("-",$fecha_expiracion);
$exp_ano=$cad_fecha[0];
$exp_mes=$cad_fecha[1];
$exp_dia=$cad_fecha[2];

$hoy_ano=date('Y');
$hoy_mes=date('m');
$hoy_dia=date('d');

//calculo timestam de las dos fechas 
$timestamp1 mktime(0,0,0,$hoy_mes,$hoy_dia,$hoy_ano); 
$timestamp2 mktime(0,0,0,$exp_mes,$exp_dia,$exp_ano); 

//resto a una fecha la otra 
$segundos_diferencia $timestamp1 $timestamp2

//convierto segundos en días 
$dias_diferencia $segundos_diferencia / (60 60 24); 

//obtengo el valor absoulto de los días (quito el posible signo negativo) 
$dias_diferencia abs($dias_diferencia); 

//quito los decimales a los días de diferencia 
$dias_diferencia floor($dias_diferencia); 
__________________
Quitenme la vida pero no la bebida.
  #4 (permalink)  
Antiguo 11/03/2010, 12:53
Avatar de mdromed  
Fecha de Ingreso: septiembre-2009
Mensajes: 389
Antigüedad: 14 años, 7 meses
Puntos: 8
Respuesta: Restar 2 fechas (pero sin la hora)

Cita:
Iniciado por cesarpunk Ver Mensaje
te dejo un ejemplo de una fecha inicial con la fecha de hoy: (solo tendrias que aumentarle las horas al tiemstamp)

Código PHP:
$fecha_expiracion="2009-09-20";

$cad_fecha=explode("-",$fecha_expiracion);
$exp_ano=$cad_fecha[0];
$exp_mes=$cad_fecha[1];
$exp_dia=$cad_fecha[2];

$hoy_ano=date('Y');
$hoy_mes=date('m');
$hoy_dia=date('d');

//calculo timestam de las dos fechas 
$timestamp1 mktime(0,0,0,$hoy_mes,$hoy_dia,$hoy_ano); 
$timestamp2 mktime(0,0,0,$exp_mes,$exp_dia,$exp_ano); 

//resto a una fecha la otra 
$segundos_diferencia $timestamp1 $timestamp2

//convierto segundos en días 
$dias_diferencia $segundos_diferencia / (60 60 24); 

//obtengo el valor absoulto de los días (quito el posible signo negativo) 
$dias_diferencia abs($dias_diferencia); 

//quito los decimales a los días de diferencia 
$dias_diferencia floor($dias_diferencia); 
Esto mismo es lo que precisamente devuelve 1 dia, n horas, n minutos, ... pero no devuelve 2 dias!
Haz la prueba ya lo veras.
  #5 (permalink)  
Antiguo 11/03/2010, 12:55
Avatar de mdromed  
Fecha de Ingreso: septiembre-2009
Mensajes: 389
Antigüedad: 14 años, 7 meses
Puntos: 8
Respuesta: Restar 2 fechas (pero sin la hora)

Cita:
Iniciado por abimaelrc Ver Mensaje
Tampoco me vale pq calcula dias enteros, es decir que si la diferencia es de 1 dia, n horas, n minutos y n segundos, no devuelve nunca 2 dias.
  #6 (permalink)  
Antiguo 11/03/2010, 13:10
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Restar 2 fechas (pero sin la hora)

Sinceramente no entiendo el problema, ya que si la diferencia es dos dias con algo extra, se supone que te devuelva solo el de 2 dias.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #7 (permalink)  
Antiguo 11/03/2010, 13:14
Avatar de mdromed  
Fecha de Ingreso: septiembre-2009
Mensajes: 389
Antigüedad: 14 años, 7 meses
Puntos: 8
Respuesta: Restar 2 fechas (pero sin la hora)

Cita:
Iniciado por abimaelrc Ver Mensaje
Sinceramente no entiendo el problema, ya que si la diferencia es dos dias con algo extra, se supone que te devuelva solo el de 2 dias.
Muy sencillo si tienes un post del dia 22/11/2010 a las 23:52 por ejemplo y otro del dia 24/11/2010 a las 01:30 por ejemplo, con lo que me propones tu devuelve 1 dia, n horas, n minutos y n segundos, pq para php 1 dia es un conjunto COMPLETO de 24 horas, no 23h y 59 mins.

Y yo quiero que me devuelva 2 dias, sin tener en cuenta las horas, minutos y segs, sino solo teniendo en cuanta los dias, es decir, 24 - 22 = 2 dias!

¿Me explico?

O si quieres, haz la prueba con el ejemplo que me has puesto tu y lo veras con tus propios ojos.
  #8 (permalink)  
Antiguo 11/03/2010, 13:15
 
Fecha de Ingreso: marzo-2010
Ubicación: Lima, Perú
Mensajes: 136
Antigüedad: 14 años, 1 mes
Puntos: 2
Respuesta: Restar 2 fechas (pero sin la hora)

Cita:
Iniciado por mdromed Ver Mensaje
Tampoco me vale pq calcula dias enteros, es decir que si la diferencia es de 1 dia, n horas, n minutos y n segundos, no devuelve nunca 2 dias.
Lógicamente que si no completa los dos días nunca te botara dicho resultado.
  #9 (permalink)  
Antiguo 11/03/2010, 13:18
 
Fecha de Ingreso: marzo-2010
Ubicación: Lima, Perú
Mensajes: 136
Antigüedad: 14 años, 1 mes
Puntos: 2
Respuesta: Restar 2 fechas (pero sin la hora)

Cita:
Iniciado por mdromed Ver Mensaje
Muy sencillo si tienes un post del dia 22/11/2010 a las 23:52 por ejemplo y otro del dia 24/11/2010 a las 01:30 por ejemplo, con lo que me propones tu devuelve 1 dia, n horas, n minutos y n segundos, pq para php 1 dia es un conjunto COMPLETO de 24 horas, no 23h y 59 mins.

Y yo quiero que me devuelva 2 dias, sin tener en cuenta las horas, minutos y segs, sino solo teniendo en cuanta los dias, es decir, 24 - 22 = 2 dias!

¿Me explico?
Entonces modifica el archivo para que solo te haga las resta entre los dias y no considere horas ni segundos. Aunque seria mejor que tambien te bote las horas, es mas practico, si estas hablando de un foro
  #10 (permalink)  
Antiguo 11/03/2010, 13:20
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Restar 2 fechas (pero sin la hora)

Bueno, en realidad lo que necesitas es hacer el calculo de las fechas y luego tomas solo los dias usando el calculo 60 / 60 / 24. Mira este ejemplo
Código PHP:
Ver original
  1. $t = (strtotime("11/24/2010") - strtotime("11/22/2010")) / 60 / 60 / 24;
  2. echo $t;
El formato de la fecha de strtotime debe ser en ingles mm/dd/aaaa
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #11 (permalink)  
Antiguo 11/03/2010, 17:44
Avatar de mdromed  
Fecha de Ingreso: septiembre-2009
Mensajes: 389
Antigüedad: 14 años, 7 meses
Puntos: 8
Respuesta: Restar 2 fechas (pero sin la hora)

Cita:
Iniciado por abimaelrc Ver Mensaje
Bueno, en realidad lo que necesitas es hacer el calculo de las fechas y luego tomas solo los dias usando el calculo 60 / 60 / 24. Mira este ejemplo
Código PHP:
Ver original
  1. $t = (strtotime("11/24/2010") - strtotime("11/22/2010")) / 60 / 60 / 24;
  2. echo $t;
El formato de la fecha de strtotime debe ser en ingles mm/dd/aaaa
Lo que pasa es que las fechas van con la hora pq las recojo de un campo datetime de mysql.
Si cojo solo los dias y los resto imaginate cuando quiera restar el dia 01 de un mes menos el 30 del mes anterior, resultaria "-29", cuando en realidad deberia devolver 2 o 3 dependiendo del mes que sea.
Dantrix esta respuesta vale tb para ti.
  #12 (permalink)  
Antiguo 11/03/2010, 17:47
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Restar 2 fechas (pero sin la hora)

Al convertir las fechas en segundos no vas a tener problemas con ello, trátalo y nos dejas saber. Cuando me referia a los días, me refieria a la fecha completa con excepción de la hora y los minutos o sea al mm/dd/aaaa.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #13 (permalink)  
Antiguo 11/03/2010, 17:55
Avatar de Tokkara  
Fecha de Ingreso: junio-2008
Mensajes: 131
Antigüedad: 15 años, 10 meses
Puntos: 5
Respuesta: Restar 2 fechas (pero sin la hora)

Pero tienes el timestampo de las fechas o no.

Si tienes el timestamp solo tienes que restar ambos y dividirlo por 24 horas.

Código PHP:
Ver original
  1. function dias_diferencia($fecha1, $fecha2)
  2. {
  3.  $res = $fecha1-$fecha2;
  4.  $segs_dia = 24*3600;
  5.  $dias = (int) $res/$seg_dias; //Extraemos los diás que hay de diferencia
  6.  $dias += $res MOD $seg_dias != 0 ? 1 : 0; //Si tiene resto es que son horas distintas. Entonces le añadimos+1
  7. }
El operador en PHP para extraer el resto es %. Pero este caracter se visualiza mal dentro de las etiquetas HIGHLIGHT. Así que pongo MOD.


Ahora si las tienes en el formato dd/mm/aaaa hh:mm:ss. Lo único que hay que hacer es jugar con la cadena. Y retirar la hora de la fecha.


Código PHP:
Ver original
  1. function transformarFechas($fecha1, $fecha2)
  2. {
  3.    $fecha1 = substr($fecha1, 0, strpos($fecha, ' ')); //Quitamos la hora a la fecha
  4.    $fecha2 = substr($fecha2, 0, strpos($fecha, ' ')); //Quitamos la hora a la fecha 2
  5.  
  6.    //y usamos la función anterior
  7.   return dias_diferencia(strtotime($fecha1), strtotime($fecha2));
  8. }
__________________
Revolucionario controlador de plantillas para php
www.simphple.com

Última edición por Tokkara; 11/03/2010 a las 18:12
  #14 (permalink)  
Antiguo 12/03/2010, 08:24
Avatar de mdromed  
Fecha de Ingreso: septiembre-2009
Mensajes: 389
Antigüedad: 14 años, 7 meses
Puntos: 8
Respuesta: Restar 2 fechas (pero sin la hora)

Cita:
Iniciado por Tokkara Ver Mensaje
Pero tienes el timestampo de las fechas o no.

Si tienes el timestamp solo tienes que restar ambos y dividirlo por 24 horas.

Código PHP:
Ver original
  1. function dias_diferencia($fecha1, $fecha2)
  2. {
  3.  $res = $fecha1-$fecha2;
  4.  $segs_dia = 24*3600;
  5.  $dias = (int) $res/$seg_dias; //Extraemos los diás que hay de diferencia
  6.  $dias += $res MOD $seg_dias != 0 ? 1 : 0; //Si tiene resto es que son horas distintas. Entonces le añadimos+1
  7. }
El operador en PHP para extraer el resto es %. Pero este caracter se visualiza mal dentro de las etiquetas HIGHLIGHT. Así que pongo MOD.


Ahora si las tienes en el formato dd/mm/aaaa hh:mm:ss. Lo único que hay que hacer es jugar con la cadena. Y retirar la hora de la fecha.


Código PHP:
Ver original
  1. function transformarFechas($fecha1, $fecha2)
  2. {
  3.    $fecha1 = substr($fecha1, 0, strpos($fecha, ' ')); //Quitamos la hora a la fecha
  4.    $fecha2 = substr($fecha2, 0, strpos($fecha, ' ')); //Quitamos la hora a la fecha 2
  5.  
  6.    //y usamos la función anterior
  7.   return dias_diferencia(strtotime($fecha1), strtotime($fecha2));
  8. }

Gracias, eso del resto no lo habia pensado pero funciona!
De todos modos si lo de restar 2 fechas "a pelo" sin pasarlas a timestamp funciona en todas las versiones de php yo creo que es lo mejor.
¿Que opinais?
  #15 (permalink)  
Antiguo 12/03/2010, 08:41
Avatar de Chupytoloco  
Fecha de Ingreso: julio-2007
Mensajes: 88
Antigüedad: 16 años, 9 meses
Puntos: 1
Respuesta: Restar 2 fechas (pero sin la hora)

Por si quieres hacerlo directamente desde sql

Código MySQL:
Ver original
  1. select time_to_sec(TIMEDIFF('2010-11-30 01:24:21','2010-11-27 23:05:10')) / 3600/24 as n_dias

Te devuelve 2.096 si kieres los dias metele un round antes del time_to_sec y ya ta.
__________________
Creador de blackmoons.net
----------------------------------------------------------------------
  #16 (permalink)  
Antiguo 12/03/2010, 08:46
Avatar de mdromed  
Fecha de Ingreso: septiembre-2009
Mensajes: 389
Antigüedad: 14 años, 7 meses
Puntos: 8
Respuesta: Restar 2 fechas (pero sin la hora)

Cita:
Iniciado por Chupytoloco Ver Mensaje
Por si quieres hacerlo directamente desde sql

Código MySQL:
Ver original
  1. select time_to_sec(TIMEDIFF('2010-11-30 01:24:21','2010-11-27 23:05:10')) / 3600/24 as n_dias

Te devuelve 2.096 si kieres los dias metele un round antes del time_to_sec y ya ta.
te lo agradezco pero lo quiero desde php solo

Etiquetas: date, restar, timestamp, fechas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:26.