2010-10-13 6 views
5

Если у меня есть две переменные $startDate="YYYYmmdd" и $endDate="YYYYmmdd", как я могу получить количество дней между ними, пожалуйста?PHP получить дни между датой начала и датой

спасибо.

+0

пожалуйста, укажите, если вы хотите количество дней включительно или без учета двух дат. – stillstanding

+0

Включая начало и конец, спасибо. – Francisc

ответ

6

Если вы используете PHP 5.3, вы можете использовать новый DateTime класс:

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

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

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

Если нет, вам необходимо использовать 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

Новые классы DateTime, DateTimeInterval, DateTimePeriod и DateTimeZone просто качаются. Я также немного поработал с ними. Я думаю, что это лучше, чем strtotime, потому что он рассматривает високосные годы, прыжки-секунты и т. Д. Итак, +1 для вас. Я также привел более подробный пример в этом сообщении: http://stackoverflow.com/questions/3108591/calculate-number-of-hours-between-2-dates-in-php/3108800#3108800 –

+0

Спасибо, lonesomeday. – Francisc

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

это один должен быть точным и пригодна для работы с PHP < 5,2

1

Вот пример кода

$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

Самый простой способ, который я нашел, чтобы получить количество дней между ними путем преобразования даты начала и окончания, чтобы Unix меток времени и делать в них вычесть на.

Затем, если вы хотите отформатировать дату, используйте его, используя функцию даты PHP.

1

Вот мой подход, основанный на жестоком поиске в большинстве случаев, только потому, что деления на секунды (в течение нескольких недель, месяцев, лет) могут не возвращать точные результаты, например, при работе с високосными годами.

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

?>

Смежные вопросы