PHP llegar días entre fecha de inicio y la fecha final
Pregunta
Si tengo dos variables $startDate="YYYYmmdd"
y $endDate="YYYYmmdd"
, ¿cómo puedo obtener el número de días entre ellas por favor?
Gracias.
Solución
Si está usando PHP 5.3, se puede utilizar la nueva DateTime
clase:
$startDate = new DateTime("20101013");
$endDate = new DateTime("20101225");
$interval = $startDate->diff($endDate);
echo $interval->days . " until Christmas"; // echos 73 days until Christmas
Si no es así, tendrá que utilizar strtotime
:
$startDate = strtotime("20101013");
$endDate = strtotime("20101225");
$interval = $endDate - $startDate;
$days = floor($interval / (60 * 60 * 24));
echo $days . " until Christmas"; // echos 73 days until Christmas
Otros consejos
<?php
function days($date1, $date2) {
$date1 = strtotime($date1);
$date2 = strtotime($date2);
return ($date2 - $date1) / (24 * 60 * 60);
}
$date1 = '20100820';
$date2 = '20100930';
echo days($date1, $date2);
?>
$DayDiff = strtotime("2010-01-12")-strtotime("2009-12-30");
echo date('z', $DayDiff)." Days";
éste debe ser precisa y utilizable con PHP <5,2
<?php
$time1=strtotime($startDate);
$time2=strtotime($endDate);
$daycount=floor(($time2-$time1)/ 86400);
?>
A continuación se muestra el código
$startDate = mktime(0,0,0,1,1,2010);
$endDate = mktime(0,0,0,12,1,2010);
$dateDiff = $date1 - $date2;
$fullDays = floor($dateDiff/(60*60*24));
echo "Differernce is $fullDays days";
La forma más fácil que he encontrado para obtener el número de días entre ellas es mediante la conversión de las fechas de inicio y fin para Unix marcas de tiempo y haciendo una de resta en ellos.
A continuación, si desea dar formato a la fecha de convertir de nuevo utilizando la función de PHP date.
Esta es mi enfoque, basado en una búsqueda brutal en la mayoría de los casos, sólo porque divisiones por segundo (por semanas, meses, años) no pueden devolver resultados precisos, ya que mientras se trabaja con los años bisiestos, por ejemplo.
<?php
function datediff( $timeformat, $startdate, $enddate )
{
$unix_startdate = strtotime( $startdate ) ;
$unix_enddate = strtotime( $enddate ) ;
$min_date = min($unix_startdate, $unix_enddate);
$max_date = max($unix_startdate, $unix_enddate);
$Sd = date( "d", $unix_startdate ) ;
$Sm = date( "m", $unix_startdate ) ;
$Sy = date( "Y", $unix_startdate ) ;
$Ed = date( "d", $unix_enddate ) ;
$Em = date( "m", $unix_enddate ) ;
$Ey = date( "Y", $unix_enddate ) ;
$unixtimediff = $unix_enddate - $unix_startdate ;
if ( $unixtimediff <= 0 ) return -1 ;
switch( strtolower( $timeformat ) )
{
case "d": // days
$divisor = 3600 * 24 ;
return floor( $unixtimediff / $divisor ) + 1 ;
break ;
case "w": // weeks
$i = 0 ;
while ( ( $min_date = strtotime("+1 DAY", $min_date) ) <= $max_date) $i++;
return floor( $i / 7 ) ;
break ;
case "m": // months
$i = $Sd != $Ed && $Sm != $Em ? 1 : 0 ;
while ( ( $min_date = strtotime("+1 MONTH", $min_date) ) <= $max_date) $i++;
return $i ;
break ;
case "q": // quaterly (3 months)
$i = $Sd != $Ed && $Sm != $Em ? 1 : 0 ;
while ( ( $min_date = strtotime("+3 MONTH", $min_date) ) <= $max_date) $i++;
return $i ;
break ;
case "y": // year
$i = $Sd != $Ed && $Sm != $Em ? 1 : 0 ;
while ( ( $min_date = strtotime("+1 MONTH", $min_date) ) <= $max_date) $i++;
return floor( $i / 12 ) ;
break ;
}
}
$startdate = "2014-01-01" ;
$enddate = "2015-12-31" ;
$formats = array( "d" => "days", "w" => "weeks", "m" => "months", "q" => "quaterly", "y" => "years" ) ;
foreach( $formats AS $K => $F )
echo "From $startdate to $enddate in $F format: ". datediff( "$K", $startdate, $enddate )."<br>" ;
?>