Foros del Web » Programando para Internet » PHP »

La funcion date_diff

Estas en el tema de La funcion date_diff en el foro de PHP en Foros del Web. Hola forer@s del web Necesito su ayuda como siempre, necesito sacar de dos fechas dadas el numero de meses que trascurren en ese rango, para ...
  #1 (permalink)  
Antiguo 04/03/2014, 11:14
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
La funcion date_diff

Hola forer@s del web

Necesito su ayuda como siempre, necesito sacar de dos fechas dadas el numero de meses que trascurren en ese rango, para lo cual tengo el siguiente codigo:

Código PHP:
$datetime1 date_create('2013-01-01');
$datetime2 date_create('2014-01-01');
$interval date_diff($datetime1$datetime2);
echo 
"meses ".$meses = ($interval->y*12)+$interval->m
Por ejemplo ese caso me da 12 meses, con lo cual estoy de acuerdo es un año cumplido, pero para los siguientes casos no estoy de acuerdo con el resultado:

Por ejemplo:

Cuantos meses pasaron entre 2013-01-01 y 2013-08-31, veamos

Enero -> 1
Febrero -> 2
Marzo -> 3
Abril -> 4
Mayo -> 5
Junio -> 6
Julio -> 7
Agosto -> 8 (Cuento todo el mes de agosto por que es hasta el dia 31)

Segun yo son 8 meses

Pero la funcion me da 7

Otro caso y con ese mismo criterio

Entre la fecha 2013-01-01 y 2013-12-31 para mi ha pasado un año pero la funcion me devuelve 11 meses.

No se si me estoy perdiendo algo en la funcion o que otra alternativa puedo ocupar para obtener los meses con el criterio que necesito?

Gracias de Antemano
  #2 (permalink)  
Antiguo 04/03/2014, 11:17
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: La funcion date_diff

Es bastante posible que exista un detalle en la forma de usar dicha función, ¿ya consultaste el manual?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 04/03/2014, 11:29
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
Respuesta: La funcion date_diff

En eso estoy pero esta vez siento que la explicacion del manual queda a deber.

Y por los comentarios creo que de hecho no es muy confiable.

Ya estoy dudando en que me pueda servir para lo que necesito :(
  #4 (permalink)  
Antiguo 04/03/2014, 12:03
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: La funcion date_diff

Si no puedes usar los viejos métodos.

Código PHP:
Ver original
  1. $fecha1="01/01/2013";
  2. $fecha2="31/08/2013";
  3.  
  4. $fecha1=explode('/',$fecha1);
  5. $fecha2=explode('/',$fecha2);
  6.  
  7. $fechainicial=mktime(0,0,0,$fecha1[1],$fecha1[0],$fecha1[2]);
  8. $fechafinal=mktime(23,59,59,$fecha2[1],$fecha2[0],$fecha2[2]);
  9.  
  10. $contador_meses=0;
  11. while($fechainicial<$fechafinal){
  12.    $contador_meses++;
  13.    $fechainicial=mktime(0,0,0,$fecha1[1]+$contador_meses,$fecha1[0],$fecha1[2]);
  14. }
  15. echo  $contador_meses;
  #5 (permalink)  
Antiguo 04/03/2014, 12:05
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: La funcion date_diff

El problema es que la función no actua como tú piensas que es correcto, es cuestión de verlo claramente, el intérvalo entre 2013-01-01 y 2013-12-31, es en efecto de 11 meses, ya que para que sean 12 meses deberías de contar hasta 2014-01-01, a la fecha 2013-12-31 no es todo el mes.

Es el mismo problema entre 2013-01-01 y 2013-08-31, sólo son 7 meses, ya que son con días absolutos, tendrías que contar hasta el 2013-09-01.

Ahora ve que date_diff el segundo parámetro es para forzarlo a ser absoluto, intenta con eso para redondear para arriba, aunque en si date_diff se esta comportando de forma lógica.
  #6 (permalink)  
Antiguo 04/03/2014, 12:15
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: La funcion date_diff

Cita:
Iniciado por catpaw Ver Mensaje
En eso estoy pero esta vez siento que la explicacion del manual queda a deber.

Y por los comentarios creo que de hecho no es muy confiable.

Ya estoy dudando en que me pueda servir para lo que necesito :(
Tu problema es sencillo de resolver:
Código PHP:
Ver original
  1. $datetime1 = new DateTime(' 2013-01-01');
  2. $datetime2 = new DateTime('2013-08-31');
  3. $datetime2->modify('first day of next month');
  4. $interval = $datetime1->diff($datetime2);
  5. echo $interval->format('%m');
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #7 (permalink)  
Antiguo 04/03/2014, 12:28
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
Respuesta: La funcion date_diff

Hola GatorV es verdad que la funcion actua de forma logica y de acuerdo a los criterios que necesito tal vez no sea mi mejor opcion, trate usar el parametro absoluto,

date_diff($datetime1, $datetime2, true);

lo puse en true pero no cambio el resultado.

Hola ocp001a probe tu funcion y se hacerca más al resultado que quiero obtener, el unico problema es que si saco los meses entre:

01-01-2013
01-01-2014

salen 13 meses y aca si deben ser 12

pero de ahi creo que en lo demas funciona bien

Gracias por sus respuestas

Seguire probando, si se les ocurre una mejora avisenme!!!
  #8 (permalink)  
Antiguo 04/03/2014, 12:33
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
Respuesta: La funcion date_diff

Hola hhs

creo que no funciona muy bien tu codigo, mira

si pongo
datetime1 = 2013-01-01
datetime2 = 2014-12-31

da cero

o

datetime1 = 2013-01-01
datetime2 = 2013-12-31

da cero

si pones:
datetime1 = 2013-01-01
datetime2 = 2013-08-31

da 8 y esta bien, pero si pones:

datetime1 = 2013-01-01
datetime2 = 2014-08-31

da 8 y esta mal porque no suma el año

gracias
  #9 (permalink)  
Antiguo 04/03/2014, 14:22
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: La funcion date_diff

Cita:
Iniciado por catpaw Ver Mensaje
Hola hhs

creo que no funciona muy bien tu codigo, mira

si pongo
datetime1 = 2013-01-01
datetime2 = 2014-12-31

da cero

o

datetime1 = 2013-01-01
datetime2 = 2013-12-31

da cero

si pones:
datetime1 = 2013-01-01
datetime2 = 2013-08-31

da 8 y esta bien, pero si pones:

datetime1 = 2013-01-01
datetime2 = 2014-08-31

da 8 y esta mal porque no suma el año

gracias
Primero no es una función lo que te pase, es solo un ejemplo que te servirá de referencia para resolver tu problema; así que lo mas importante es ver que hace el ejemplo y como te puede servir.

El fragmento de código funciona como debe de ser en cada caso que expones, ya que estas tomando las diferencias de forma absoluta y lo que tu quieres es calcular el tiempo relativo entre fechas como el ultimo caso que expones, en el cual el resultado es un año y 8 meses.
Resolver la situación sigue siendo sencilla, nada mas cambia la ultima linea:
Código PHP:
Ver original
  1. echo $interval->format('%m');
Código PHP:
Ver original
  1. echo $interval->format('%y years %m months and %d days');
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #10 (permalink)  
Antiguo 04/03/2014, 15:22
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
Respuesta: La funcion date_diff

No yo quiero que me diga en meses ni años ni dias ni horas

Entonces si pongo

2013-08-01
a
2014-08-01

Me debe decir 20 meses

8 meses + 1 año (12 meses)
  #11 (permalink)  
Antiguo 04/03/2014, 16:18
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: La funcion date_diff

Cita:
Iniciado por catpaw Ver Mensaje
No yo quiero que me diga en meses ni años ni dias ni horas
Y no esperes de mi parte que te resuelva la vida, escribiendo la función exacta que te da los meses, esa parte te corresponde a ti. Pero si puedo ayudarte un poco, solo por que me caes bien.
Cita:
Entonces si pongo

2013-08-01
a
2014-08-01

Me debe decir 20 meses

8 meses + 1 año (12 meses)
Si te tomaras el tiempo de leer la documentación, sabrias que la ultima linea de código del ejemplo que te di, te da todo lo necesario para hacer lo que necesitas: Lo unico que tienes que hacer es convertir el año a su correspondiente en meses.
puedes hacer algo asi:
Código PHP:
Ver original
  1. $year =  $interval->format('%y');
  2. $month = $interval->format('%m');
La suma y otras fornas de hacer lo mismo queda a tu consideración
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Etiquetas: fecha, funcion
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 15:48.