Foros del Web » Programando para Internet » PHP »

Expediente X con fechas

Estas en el tema de Expediente X con fechas en el foro de PHP en Foros del Web. Hola amigos, llevo 2 días con algo intrigante que no logro resolver respecto a la devolución del día de la semana de la función date(). ...
  #1 (permalink)  
Antiguo 24/01/2011, 03:00
 
Fecha de Ingreso: abril-2007
Mensajes: 30
Antigüedad: 17 años
Puntos: 0
Busqueda Expediente X con fechas

Hola amigos, llevo 2 días con algo intrigante que no logro resolver respecto a la devolución del día de la semana de la función date(). Supongo que alguna vez os ha pasado que os quedáis atascados por días y no veis la luz.
Por eso me he decidido a escribir en el foro, pues después de freirme el cerebro de pensar, lo asumo, necesito ayuda para salir.

La cuestión es que mi script en el cual uso una función que ZiTAL publicó en el foro, consiste en un calendario que se comienza a partir de una fecha base ('d', 'm' y 'Y' ) y que aplica una función de suma de días para ir construyéndose en un periodo determinado.

El expediente X surge cuando, los meses 10, osea los octubre, ocurre algo insólito, y es que hay un día de las últimas semanas, que coincide en Lunes, que la función date('w') me lo devuelve como 0 (cero), es decir que aun siendo Lunes lo considera como Domingo, lo más curioso es que al siguiente día sumado se restablece correctamente, pero dejando en ese día "defectuoso" esa repetición marcada.

Un extracto del código es el siguiente:

Código:
<?
//defino fecha global
$g_anio = "2008";
$g_mes = "10";
$g_dia = "01"; 

function calculadia($dias_sumar){
	$dia=$GLOBALS["g_dia"]; //numero de dia en que se contrató
	$mes=$GLOBALS["g_mes"]; //numero del mes en que se contrató
	$ano=$GLOBALS["g_anio"]; //numero del año en que se contrató	
	$hoy_unix=mktime(0,0,0,$mes,$dia,$ano); //el dia de hoy en formato unix
	$dia_resul=$hoy_unix+($dias_sumar*24*60*60); //dias * horas * minutos * segundos.
	//Devuelvo el resultado
	return $dia_resul;	
}

$dias=0;
$periodo=30;
while ($dias<$periodo){
		echo 'Día semana: '.date('w',calculadia($dias)).' - Día mes: '.date('d',calculadia($dias)).'- Día sumado: '.$dias.'<br />';	
	$dias++;
}
?>

Verás como resultado una secuencia del estilo de:
(donde el día de mes 26 se repite, coincide con los días 25 y 26 a sumar en la función de suma)

Código:
...
Día semana: 6 - Día mes: 25- Día sumado: 24
Día semana: 0 - Día mes: 26- Día sumado: 25
Día semana: 0 - Día mes: 26- Día sumado: 26
Día semana: 1 - Día mes: 27- Día sumado: 27
Día semana: 2 - Día mes: 28- Día sumado: 28
...

Si cambias la fecha a octubre de 2009 verás que el día de mes que se repite es el 25 en vez del 26, y así todos los años. Curiosamente solo pasa en octubre, o yo no me he dado cuenta de más. Quizá es un error tonto, quizás es necesario la revisión de la función, sinceramente y modestamente, esto me ha superado. SI alguien puede echarme un cable le estaré muy agradecido.

Muchas gracias.

Última edición por solonova; 24/01/2011 a las 03:34
  #2 (permalink)  
Antiguo 24/01/2011, 04:05
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Expediente X con fechas

Acabo de probar tu código y a mi no me hace eso que te hace a ti
  #3 (permalink)  
Antiguo 24/01/2011, 04:18
 
Fecha de Ingreso: abril-2007
Mensajes: 30
Antigüedad: 17 años
Puntos: 0
Respuesta: Expediente X con fechas

Gracias por tu prueba Heli0s.
Me ha dejado mosqueado lo que dijiste y lo he probado además de en el localhost en mi servidor online y es curioso, no lo hacía, pero he ampliado el periodo a 365 dias y lo hace pero en otra fecha, en este caso el 1 de Noviembre.

Cada vez se pone más rara la cosa
  #4 (permalink)  
Antiguo 24/01/2011, 04:25
 
Fecha de Ingreso: abril-2007
Mensajes: 30
Antigüedad: 17 años
Puntos: 0
Respuesta: Expediente X con fechas

Le he metido un swicht al script para que solo muestre los días que repite, curiosamente lo hace una vez al año, aun no sé cual es el patrón, os dejo el nuevo script:

Código:
<?
//defino fecha global
$g_anio = "2009";
$g_mes = "10";
$g_dia = "01"; 

function calculadia($dias_sumar){
	$dia=$GLOBALS["g_dia"]; //numero de dia en que se contrató
	$mes=$GLOBALS["g_mes"]; //numero del mes en que se contrató
	$ano=$GLOBALS["g_anio"]; //numero del año en que se contrató	
	$hoy_unix=mktime(0,0,0,$mes,$dia,$ano); //el dia de hoy en formato unix
	
	$dia_resul=$hoy_unix+($dias_sumar*24*60*60); //dias * horas * minutos * segundos.
	//Devuelvo el resultado
	return $dia_resul;	
}
$sw=0;
$dias=0;
$periodo=1265;
while ($dias<$periodo){
	if($sw==date('d',calculadia($dias))) {echo '+++';$sw=0;
	echo 'Día semana: '.date('w',calculadia($dias)).' - Día/mes/año: '.date('d',calculadia($dias)).'/'.date('m',calculadia($dias)).'/'.date('Y',calculadia($dias)).'- Día sumado: '.$dias.'<br />';}	
	$sw=date('d',calculadia($dias));
	$dias++;
	
}
?>

Esto muestra en mi localhost:

+++Día semana: 0 - Día/mes/año: 25/10/2009- Día sumado: 25
+++Día semana: 0 - Día/mes/año: 31/10/2010- Día sumado: 396
+++Día semana: 0 - Día/mes/año: 30/10/2011- Día sumado: 760
+++Día semana: 0 - Día/mes/año: 28/10/2012- Día sumado: 1124


Y esto en mi servidor en USA:

+++Día semana: 0 - Día/mes/año: 01/11/2009- Día sumado: 32
+++Día semana: 0 - Día/mes/año: 07/11/2010- Día sumado: 403
+++Día semana: 0 - Día/mes/año: 06/11/2011- Día sumado: 767
+++Día semana: 0 - Día/mes/año: 04/11/2012- Día sumado: 1131

Última edición por solonova; 24/01/2011 a las 04:30
  #5 (permalink)  
Antiguo 24/01/2011, 04:43
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Expediente X con fechas

Usando tu nuevo script, y incrementando los dias a 1000, no me sale nada, osea que a mi no se me repiten.

No sé cual puede ser el patron, prueba a imprimir en pantalla tambien el valor de $i, y los valores los cuales usa la función para saber cual es el defectuoso.

Un saludo
  #6 (permalink)  
Antiguo 24/01/2011, 04:49
 
Fecha de Ingreso: abril-2007
Mensajes: 30
Antigüedad: 17 años
Puntos: 0
Respuesta: Expediente X con fechas

Hola de nuevo Helios, gracias por tu prueba.

Perdona no entiendo a qué te refieres con imprimir el valor de $i, pues el script no tiene ninguna variable $i. Si te refieres a la variable $dias que es la que incrementa el while ya es mostrada, es el último valor de la salida (Día sumado: ) y se incrementa correctamente.

Cuando me has dicho que a ti no te aparecía el error me ha mosqueado, pero lo he probado en 2 servidores distintos además de en mi localhost y el error continúa. Prueba por favor el nuevo script, creo que quizá se te está pasando la repetición.

Si alguien más puede echarme un cable lo agradezco de corazón.
Mil gracias.
  #7 (permalink)  
Antiguo 24/01/2011, 04:52
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Expediente X con fechas

Si me refería a la variable $dias.

Entonces una prueba que se me ocurre, es que mires en que valores falla, y hagas la prueba por separado, usando la función date pero sin bucle, dandole tu el valor en el que falla.

Un saludo
  #8 (permalink)  
Antiguo 24/01/2011, 04:54
 
Fecha de Ingreso: abril-2007
Mensajes: 30
Antigüedad: 17 años
Puntos: 0
Respuesta: Expediente X con fechas

Gracias Helios. Si, eso fue lo primero que hice, pero como son tantos valores a probar lo mejor es el bucle. Manualmente los días repetidos me devuelve el mismo error, vamos era lo lógico, sino ya sería para pegarse un tiro.
  #9 (permalink)  
Antiguo 24/01/2011, 04:56
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Expediente X con fechas

Con todas las modificaciones que has realizado, ¿en que valores son en los que te falla ahora mismo?
  #10 (permalink)  
Antiguo 24/01/2011, 05:33
 
Fecha de Ingreso: abril-2007
Mensajes: 30
Antigüedad: 17 años
Puntos: 0
Respuesta: Expediente X con fechas

Helios, ya los expuse, tanto los valores de localhost como los del servidor.

No obstante, he controlado el error para que lo salte con un sw, es decir, simplemente si el día es repetido, salta el proceso y pasa al siguiente día, y fuera.

Eso si, me quedo con la duda de qué especie de fenómeno paranormal le sucede al motor date de php en esos recurrentes días.

Saludos y gracias. Estaré pendiente por si alguien lo descubre.

Etiquetas: 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 19:42.