Domanda

Se ho due variabili $startDate="YYYYmmdd" e $endDate="YYYYmmdd", come posso ottenere il numero di giorni tra loro favore?

Grazie.

È stato utile?

Soluzione

Se si sta utilizzando PHP 5.3, è possibile utilizzare la nuova DateTime classe:

$startDate = new DateTime("20101013");
$endDate = new DateTime("20101225");

$interval = $startDate->diff($endDate);

echo $interval->days . " until Christmas"; // echos 73 days until Christmas

In caso contrario, sarà necessario utilizzare 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

Altri suggerimenti

<?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";

questo dovrebbe essere preciso e utilizzabile con PHP <5.2

<?php   
 $time1=strtotime($startDate);
    $time2=strtotime($endDate);
    $daycount=floor(($time2-$time1)/ 86400);
?>

Ecco il codice di esempio

$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"; 

Il modo più semplice che ho trovato per ottenere il numero di giorni tra loro è convertendo le date di inizio e fine a Unix timestamp e facendo un Sottrai su di loro.

Poi, se si desidera formattare la data riconvertirlo utilizzando la funzione di data PHP.

Ecco il mio approccio, basato su una ricerca brutale, nella maggior parte dei casi, solo perché le divisioni di secondi (per settimane, mesi, anni) non può restituire risultati precisi, come durante il lavoro con gli anni bisestili, per esempio.

<?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>" ;

?>

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top