2010-10-13 2 views

risposta

6

Se si utilizza 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 
+0

Le nuove classi DateTime, DateTimeInterval, DateTimePeriod e DateTimeZone sono semplicemente rock. Ho anche fatto esperienza con loro. Penso che sia meglio di uno strtotime, perché considera i leap-years, i leap-seconts, ecc. Quindi +1 per te. Ho anche fornito un esempio più dettagliato in questo post: http://stackoverflow.com/questions/3108591/calculate-number-of-hours-between-2-dates-in-php/3108800#3108800 –

+0

Grazie, lonesomeday. – Francisc

2
$DayDiff = strtotime("2010-01-12")-strtotime("2009-12-30"); 
echo date('z', $DayDiff)." Days"; 

questo dovrebbe essere preciso e utilizzabile con PHP < 5.2

1

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"; 
2
<?php 
$time1=strtotime($startDate); 
    $time2=strtotime($endDate); 
    $daycount=floor(($time2-$time1)/ 86400); 
?> 
2
<?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); 
?> 
1

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

Quindi se si desidera formattare la data, riconvertirla con la funzione data di PHP.

1

Ecco il mio approccio, basato su una ricerca brutale nella maggior parte dei casi, solo perché le divisioni per secondi (per settimane, mesi, anni) potrebbero non restituire risultati precisi, come ad esempio quando si lavora con anni bisestili.

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

?>