2010-10-13 5 views

Antwort

6

Wenn Sie PHP 5.3 verwenden, können Sie die neue DateTime-Klasse verwenden:

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

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

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

Wenn nicht, müssen Sie strtotime verwenden:

$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

Die neuen DateTime-, DateTimeInterval-, DateTimePeriod- und DateTimeZone-Klassen rocken einfach. Ich habe auch etwas Erfahrung mit ihnen gemacht. Ich denke, es ist besser als strtotime, weil es Schaltjahre, Sprungbeile usw. berücksichtigt. Also +1 für Sie. Ich gab auch ein ausführlicheres Beispiel in diesem Beitrag: http://stackoverflow.com/questions/3108591/calculate-number-of-hours-between-2-dates-in-php/3108800#3108800 –

+0

Danke, lonesomeday. – Francisc

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

dies sollte man mit PHP < 5.2

1

Hier präzise und verwendbar sein, ist der Beispielcode

$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

Der einfachste Weg, den ich gefunden habe, die Anzahl der Tage zwischen ihnen zu bekommen, ist durch die Start- und Enddaten zu Unix-Zeitstempel konvertieren und auf sie eine subtrahieren tun.

Wenn Sie das Datum dann formatieren möchten, konvertieren Sie es mit der PHP-Datumsfunktion zurück.

1

Hier ist meine Herangehensweise, basierend auf einer brutalen Suche in den meisten Fällen, nur weil Divisionen in Sekunden (für Wochen, Monate, Jahre) keine präzisen Ergebnisse liefern, wie zum Beispiel bei Schaltjahren.

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

?>

Verwandte Themen