PHP تحصل على أيام بين تاريخ البدء والنهاية

StackOverflow https://stackoverflow.com/questions/3921800

  •  29-09-2019
  •  | 
  •  

سؤال

إذا كان لدي متغيران $startDate="YYYYmmdd" و $endDate="YYYYmmdd", ، كيف يمكنني الحصول على عدد الأيام بينهما من فضلك؟

شكرًا لك.

هل كانت مفيدة؟

المحلول

إذا كنت تستخدم 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

نصائح أخرى

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

يجب أن يكون هذا دقيقًا وقابل للاستخدام مع PHP <5.2

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

هنا هو نموذج التعليمات البرمجية

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

أسهل طريقة وجدت للحصول على عدد الأيام بينهما هي تحويل تواريخ البداية والنهاية إلى طوابع الزمنية UNIX والقيام بطرح عليها.

ثم إذا كنت ترغب في تنسيق التاريخ ، قم بتحويله مرة أخرى باستخدام وظيفة تاريخ PHP.

إليكم نهجي ، استنادًا إلى البحث الوحشي في معظم الحالات ، لمجرد أن الأقسام حسب الثواني (لأسابيع أو شهور أو سنوات) قد لا تعيد نتائج دقيقة ، كما هو الحال أثناء العمل مع سنوات القفزة على سبيل المثال.

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

?>

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top