partimos de una funcion en PHP que resta dias
function restadias($fecha,$dias){
list( $dia, $mes, $year ) = split( '/', $fecha );
//teniendo la fecha tenemos que obtener el lunes y el viernes de esa semana.
$f=mktime(0 , 0, 0, (int)$mes , (int)$dia, (int)$year);
$sumadias=60*60*24*($dias);
$l=$f-$sumadias;
$dia1=date('j',$l);
if ($dia1<10){
$d="0".$dia1;
}else{
$d=$dia1;
}
$mes1=date('n',$l);
if ($mes1<10){
$m="0".$mes1;
}else{
$m=$mes1;
}
$year1=date('Y',$l);
$nf = $d."/".$m."/".$year1;
return $nf;
}
Si vemos la función, lo que hace es partir la fecha de texto dd/mm/aaaa y obtener el valor en segundos con mktime, luego los días que va a restar los multiplica por el número de segundos del día y hace la resta, el resultado lo formatea otra vez en formato dd/mm/aaaa
Así para el ejemplo:
echo restadias("03/03/2016",1);
El resultado es o debería de ser 02/03/2016
Pero para restadias("28/03/2016",1) cuando debería de darnos el día 27 nos devuelve un fatídico 26/03/2016.
1459123200 - 86400 = 1459036800
Y todo por el cambio de hora, como la función realiza el mktime pasando 0 en horas, minutos y segundos, al restar 86400 segundos según la funcion $dia1=date('j',$l)
Y lo vemos mejor viendo la hora:
date("H",$l);
Donde parte de las 0 y nos devuelve 23.
para solucionarlo, modificamos la función restadias por:
function restadias($fecha,$dias){
list( $dia, $mes, $year ) = split( '/', $fecha );
//teniendo la fecha tenemos que obtener el lunes y el viernes de esa semana.
$f=mktime(12 , 0, 0, (int)$mes , (int)$dia, (int)$year);
$sumadias=60*60*24*($dias);
$l=$f-$sumadias;
$dia1=date('j',$l);
if ($dia1<10){
$d="0".$dia1;
}else{
$d=$dia1;
}
$mes1=date('n',$l);
if ($mes1<10){
$m="0".$mes1;
}else{
$m=$mes1;
}
$year1=date('Y',$l);
$nf = $d."/".$m."/".$year1;
return $nf;
}
Donde hemos puesto como hora las 12, asi nos evitamos el problema del cambio de hora, de 2 a 3 de la mañana.