如何在PHP中计算两个日期之间的天数?

25
如果我有几个字符串$startDate$endDate,它们分别设置为(例如)"2011/07/01""2011/07/17"(意思是2011年7月1日和2011年7月17日)。我该如何计算从开始日期到结束日期的天数?在给出的例子中,这将是17天。

寻找两个日期之间的天数。 - Eric Lavoie
11个回答

54

以下是原始的方法

$startTimeStamp = strtotime("2011/07/01");
$endTimeStamp = strtotime("2011/07/17");

$timeDiff = abs($endTimeStamp - $startTimeStamp);

$numberDays = $timeDiff/86400;  // 86400 seconds in one day

// and you might want to convert to integer
$numberDays = intval($numberDays);

4
如果本地日期包含夏令时切换,那么程序将不能正常工作,因为在这些日期里会有23或25个小时的情况。 - Michael Borgwardt
@MichaelBorgwardt,你有两个确定的日期,我不明白夏令时怎么会影响它们。 - pronebird
2
@Andy:如果你所说的“solid”是指“字面上的”,那当然可以,但问题中说的是“例如”,而不是“我需要一个解决方案来处理2011年的这些具体日期,并且不关心其他日期可能出现的任何问题”。 - Michael Borgwardt
@MichaelBorgwardt 已批准。 - pronebird
他们说最好使用“Datetime”类,因为“strtotime”无法比较2038年以后的日期... - Pathros
显示剩余2条评论

36

使用 DateTime::diff (也称为 date_diff):

$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);

或者:

$datetime1 = date_create('2009-10-11');
$datetime2 = date_create('2009-10-13');
$interval = date_diff($datetime1, $datetime2);

你可以通过调用$interval->days来将时间间隔转换为整数。


似乎无法使用我的初始字符串“2011/07/01”和“2011/07/17”...“调用未定义的函数date_diff()..”。我正在使用PHP 5.2.10。 - cannyboy
4
根据文档(在上方链接),这需要的是PHP版本大于等于5.3.0。下次提问时,请包含PHP版本信息。 - wuputah
只有在您的日期时间中没有时间时,它才能正常工作,否则可能会返回1-2天或更少。 - Dukeatcoding
2
错误:$interval->days 返回 6015 天!如果我使用 $interval->format("%d"),它只会返回天数之间的差异,而不考虑月份和年份。 - Alex
1
请注意,如果您想在计数中包括开始和结束日期,则需要将结果加1。 - Andrew Downes

5

PHP有一个date_diff()函数来实现此功能。


3
$date1 = date_create("2017-04-15");
$date2 = date_create("2017-05-18");

//difference between two dates
$diff = date_diff($date1,$date2);

//count days
echo 'Days Count - '.$diff->format("%a");

3

3

如果您的日期时间还包括小时:分钟:秒,并且仍然想要得到天数的数量...

   /**
     * Returns the total number of days between to DateTimes, 
     * if it is within the same year
     * @param $start
     * @param $end
     */
    public function dateTimesToDays($start,$end){
       return intval($end->format('z')) - intval($start->format('z')) + 1;
    }

https://github.com/dukeatcoding/timespan-converter


1

对我来说,这些解决方案都没有起作用。对于那些仍然使用 PHP 5.2 的人(DateTime::diff 是在 5.3 中引入的),这个解决方案是有效的:

function howDays($from, $to) {
    $first_date = strtotime($from);
    $second_date = strtotime($to);
    $offset = $second_date-$first_date; 
    return floor($offset/60/60/24);
}

0
如果您想知道天数(如果有的话),小时数(如果有的话),分钟数(如果有的话)和秒数,可以按照以下步骤进行:
$previousTimeStamp = strtotime("2011/07/01 21:12:34");
$lastTimeStamp = strtotime("2013/09/17 12:34:11");

$menos=$lastTimeStamp-$previousTimeStamp;

$mins=$menos/60;
if($mins<1){
$showing= $menos . " seconds ago";
}
else{
$minsfinal=floor($mins);
$secondsfinal=$menos-($minsfinal*60);
$hours=$minsfinal/60;
if($hours<1){
$showing= $minsfinal . " minutes and " . $secondsfinal. " seconds ago";

}
else{
$hoursfinal=floor($hours);
$minssuperfinal=$minsfinal-($hoursfinal*60);
$days=$hoursfinal/24;
if($days<1){
$showing= $hoursfinal . "hours, " . $minssuperfinal . " minutes and " . $secondsfinal. " seconds ago";

}
else{
$daysfinal=floor($days);
$hourssuperfinal=$hoursfinal-($daysfinal*24);
$showing= $daysfinal. "days, " .$hourssuperfinal . " hours, " . $minssuperfinal . " minutes and " . $secondsfinal. " seconds ago";
}}}

echo $showing;

如果你想要添加月份和年份,你可以使用相同的逻辑。


0

简单的计数方法是:

$currentdate = date('Y-m-d H:i:s');
$after1yrdate =  date("Y-m-d H:i:s", strtotime("+1 year", strtotime($data)));

$diff = (strtotime($after1yrdate) - strtotime($currentdate)) / (60 * 60 * 24);

echo "<p style='color:red'>The difference is ".round($diff)." Days</p>";

0
我创建了一个函数,如果你传递两个日期,它将返回按天计算的值。为了更好地理解,请看开始日期的输出:2018-11-12 11:41:19和结束日期2018-11-16 12:07:26
private function getTimeData($str1,$str2){
$datetime1 = strtotime($str1);
$datetime2 = strtotime($str2);
$myArray = array();
if(date('d', $datetime2) != date('d', $datetime1) ||  date('m', $datetime2) != date('m', $datetime1) || date('y', $datetime2) != date('y', $datetime1)){
    $exStr1 = explode(' ',$str1);
    $exStr2 = explode(' ',$str2);
    $datediff = strtotime($exStr2[0]) - strtotime($exStr1[0]);
    $totalDays = round($datediff / (60 * 60 * 24));
    $actualDate1 = $datetime1;
    $actualDate2 = date('Y-m-d', $datetime1)." 23:59:59";
    $interval  = abs(strtotime($actualDate2)-$actualDate1);
    $minutes   = round($interval / 60);
    $myArray[0]['startDate'] = date('Y-m-d H:i:s', $actualDate1); 
    $myArray[0]['endDate'] = $actualDate2;
    $myArray[0]['minutes'] = $minutes;
    $i = 1;
    if($totalDays > 1){    
        for($i=1; $i<$totalDays; $i++){
            $dayString = "+".$i." day";
            $edate = strtotime($dayString, $actualDate1);
            $myArray[$i]['startDate'] = date('Y-m-d', $edate)." 00:00:00"; 
            $myArray[$i]['endDate'] = date('Y-m-d', $edate)." 23:59:59"; 
            $myArray[$i]['minutes'] = 1440;
        }
    }
    $actualSecDate1 = date('Y-m-d', $datetime2)." 00:00:00";
    $actualSecDate2 = $datetime2;
    $interval  = abs(strtotime($actualSecDate1)-$actualSecDate2);
    $minutes   = round($interval / 60);
    $myArray[$i]['startDate'] = $actualSecDate1; 
    $myArray[$i]['endDate'] = date('Y-m-d H:i:s', $actualSecDate2); 
    $myArray[$i]['minutes'] = $minutes;
}
else{
    $interval  = abs($datetime2-$datetime1);
    $minutes   = round($interval / 60);
    $myArray[0]['startDate'] = date('Y-m-d H:i:s', $datetime1); 
    $myArray[0]['endDate'] = date('Y-m-d H:i:s', $datetime2);
    $myArray[0]['minutes'] = $minutes;
}

return $myArray;
}

输出

Array
(
[0] => Array
    (
        [startDate] => 2018-11-12 11:41:19
        [endDate] => 2018-11-12 23:59:59
        [minutes] => 739
    )

[1] => Array
    (
        [startDate] => 2018-11-13 00:00:00
        [endDate] => 2018-11-13 23:59:59
        [minutes] => 1440
    )

[2] => Array
    (
        [startDate] => 2018-11-14 00:00:00
        [endDate] => 2018-11-14 23:59:59
        [minutes] => 1440
    )

[3] => Array
    (
        [startDate] => 2018-11-15 00:00:00
        [endDate] => 2018-11-15 23:59:59
        [minutes] => 1440
    )

[4] => Array
    (
        [startDate] => 2018-11-16 00:00:00
        [endDate] => 2018-11-16 12:07:26
        [minutes] => 727
    )
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接