PHP تحصل على أيام بين تاريخ البدء والنهاية
سؤال
إذا كان لدي متغيران $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>" ;
?>