Sacar fechas de cada día entre 2 fechas dadas.

Hola marcelo!
Volviendo a este tema quisiera recopliar los días en medio de las 2 fechas escogidas por el usuario $llegada=20-11-2009 $salida=13-12-2009, como puedo recoger los días de en medio, para saber que días son y de que temporada para sacar precio total de la estancia.
Por ejemplo:
Temporada baja desde 10-11-2009 hasta 30-11-2009, Temporada alta desde 1-12-2009 a 31-12-2009.
Tendría que coger cada día entre $llegada y $salida para comparar y contar cuantos son de cada temporada multiplicarlo por el precio de su temporada correspondiente y sacar el importe total de la reserva.
En fin, eso, ¿Cómo saco la fecha de cada día entre $llegada y $salida
$llegada0=$llegada (que es 20-11-2009). Temporada baja
$llegada1=21-11-2009 Temporada baja
etc..
$llegada11=1-12-2009 Temporada alta
Gracias!

1 Respuesta

Respuesta
1
Realmente es complicado pero no imposible.¨
He hecho un ejemplo para que puedas tener una idea de como hacerlo.
<?php
$ini_temporada_baja = '10-11-2009';
$fin_temporada_baja = '30-11-2009';
$ini_temporada_alta = '01-12-2009';
$fin_temporada_alta = '31-12-2009';
$i = explode('-', $ini_temporada_baja);
$f = explode('-', $fin_temporada_baja);
$i_baja = mktime(0, 0, 0, $i[1], $i[0], $i[2]);
$f_baja = mktime(0, 0, 0, $f[1], $f[0], $f[2]);
$i = explode('-', $ini_temporada_alta);
$f = explode('-', $fin_temporada_alta);
$i_alta = mktime(0, 0, 0, $i[1], $i[0], $i[2]);
$f_alta = mktime(0, 0, 0, $f[1], $f[0], $f[2]);
$a = explode('-', $llegada);
$b = explode('-', $salida);
$a = mktime(0, 0, 0, $a[1], $a[0], $a[2]);
$b = mktime(0, 0, 0, $b[1], $b[0], $b[2]);
if($a >= $i_baja && $b <= $f_baja) $dias_baja = ($b - $a) / 86400;
elseif($a >= $i_baja) $dias_baja = (($f_baja - $a) / 86400);
elseif($b <= $f_baja) $dias_baja = (($b - $i_baja) / 86400) + 1;
elseif($a <= $i_baja && $b >= $f_baja) $dias_baja = (($f_baja - $i_baja) / 86400) + 1;
if(!isset($dias_baja) || $dias_baja < 0) $dias_baja = 0;
if($a >= $i_alta && $b <= $f_alta) $dias_alta = ($b - $a) / 86400;
elseif($a >= $i_alta) $dias_alta = (($f_alta - $a) / 86400);
elseif($b <= $f_alta) $dias_alta = (($b - $i_alta) / 86400) + 1;
elseif($a <= $i_alta && $b >= $f_alta) $dias_alta = (($f_alta - $i_alta) / 86400) + 1;
if(!isset($dias_alta) || $dias_alta < 0) $dias_alta = 0;
$dias_total = ($b - $a) / 86400;
echo 'Días en temporada baja:' . $dias_baja . '<br>Días en temporada alta:' . $dias_alta . '<br>días:'.$dias_total;
?>
De esta forma, $dias_baja devuelve la cantidad de días en temporada baja y $dias_alta la cantidad de días en temporada alta.
Ahora para saber el precio tienes que multiplicar $dias_baja y $dias_alta por el precio de la temporada, sin olvidar los días normales.
<?php
$precio_alta = 100;
$precio_baja = 50;
$precio_normal = 75;
$factura = ($dias_alta * $precio_alta) + ($dias_alta * $precio_alta) + ($dias_total - ($dias_alta + $dias_baja) * $precio_total);
?>
Y ya tienes $factura con el precio de todos los días, contando las temporadas altas y bajas.
Sólo una aclaración:
1. Lo que hice fue: una consulta a tabla temporadas por cada temporada
//Debo comprobar las fechas de cada temporada con las fechas dadas
$TemAsql=mysql_query("SELECT * FROM temporadas WHERE TEMPORADA='Alta' AND (SEGDESDE<=".$SegundosEntrada." OR SEGDESDE<=".$SegundosSalida.") AND (SEGHASTA>=".$SegundosEntrada." OR SEGHASTA>=".$SegundosSalida.");") or die ('Error al consultar temporadas Altas');
$ResultTemporadaAlta=mysql_num_rows($TemAsql);
$TemporadaAlta=mysql_fetch_array($TemAsql);
2. Después todo este rollo:
//Condición si temporada Alta
if($ResultTemporadaAlta>0) {
//Condiciones Calculo los días de Temporada alta que hay en las fechas dadas
if(($SegundosEntrada>=$TemporadaAlta['SEGDESDE'])&&($SegundosSalida<=$TemporadaAlta['SEGHASTA'])) { $DiasTemporadaAlta=($SegundosSalida-$SegundosEntrada)/86400; }
elseif($SegundosEntrada>=$TemporadaAlta['SEGDESDE']) { $DiasTemporadaAlta=($TemporadaAlta['SEGHASTA']-$SegundosEntrada)/86400; }
elseif(($SegundosSalida<=$TemporadaAlta['SEGHASTA'])) { $DiasTemporadaAlta=(($SegundosSalida-$TemporadaAlta['SEGDESDE'])/86400)+1; }
elseif(($SegundosEntrada<=$TemporadaAlta['SEGDESDE'])&&($SegundosSalida>=$TemporadaAlta['SEGHASTA'])) { $DiasTemporadaAlta=(($TemporadaAlta['SEGHASTA']-$TemporadaAlta['SEGDESDE'])/86400)+1; }
if((!isset($DiasTemporadaAlta))||($DiasTemporadaAlta<0)) { $DiasTemporadaAlta=0; } //Cierro Condiciones Calculo
 } //Cierro Condición si temporada Alta
3. Una vez hecho esto por cada temporada, Cuento las noches y consulto las tarifas:
//Recojo el $NumNoches sumando sumando los Dias de cada temporada
$NumNoches=($SegundosSalida-$SegundosEntrada)/86400;
//Saco las Tarifas de las temporadas
$Tarifasql=mysql_query("SELECT PVPDIABAJA,PVPDIAMEDIA,PVPDIAALTA FROM tarifas WHERE REFVILLA='".$RefVilla."';") or die ('Error al sacar Precios de Temporadas');
$PrecioTemporada=mysql_fetch_array($Tarifasql);
4. Calculo los precios de cada temporada que se recogen en las fechas dadas:
//Sumo los diferentes precios Para sacar $PVP
$PrecioTotal=(($DiasTemporadaAlta*$PrecioTemporada[2])+($DiasTemporadaBaja*$PrecioTemporada[0])+($DiasTemporadaMedia*$PrecioTemporada[1]));
Y tú me habías puesto.
$factura = ($dias_alta * $precio_alta) + ($dias_alta * $precio_alta) + ($dias_total - ($dias_alta + $dias_baja) * $precio_total); de esta manera es incorrecto
5. Aquí doy formato con 2 decimales.
$PVP=number_format($PrecioTotal,2,',','.');

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas