【问题标题】:How to count days between two dates in PHP?如何计算PHP中两个日期之间的天数?
【发布时间】:2011-04-08 21:46:46
【问题描述】:

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

【问题讨论】:

标签: php date count


【解决方案1】:

我创建了一个函数,如果您传递两个日期,它将返回按天计算的值。为了更好地理解,请查看开始日期的输出: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
    )
)

【讨论】:

    【解决方案2】:
    $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】:

      您可以使用date_diff 计算两个日期之间的差:

      $date1 = date_create("2013-03-15");
      $date2 = date_create("2013-12-12");
      $diff =  date_diff($date1 , $date2);
      echo  $diff->format("%R%a days");
      

      【讨论】:

        【解决方案4】:

        简单的计数方法是,

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

        【讨论】:

          【解决方案5】:

          如果您想知道天数(如果有)、小时数(如果有)、分钟(如果有)和秒,可以执行以下操作:

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

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

          【讨论】:

            【解决方案6】:

            如果您的 DateTime 也有 hour:minutes:seconds 并且您仍然希望有天数..

               /**
                 * 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

            【讨论】:

              【解决方案7】:
              <?php
              $datetime1 = new DateTime('2009-10-11');
              $datetime2 = new DateTime('2009-10-13');
              $interval = $datetime1->diff($datetime2);
              echo $interval->format('%R%a days');
              ?>
              

              来源:http://www.php.net/manual/en/datetime.diff.php

              【讨论】:

                【解决方案8】:

                没有一个解决方案对我有用。对于仍在使用 PHP 5.2 的人(5.3 中引入了 DateTime::diff),此解决方案有效:

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

                【讨论】:

                  【解决方案9】:

                  这是最原始的方法

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

                  【讨论】:

                  • 当您的本地日期包含日间储蓄时间切换时将无法正常工作,因为在这些日期您有 23 或 25 小时的日期。
                  • 实际上,这些日期是 16 天。我需要让日期忽略夏令时吗?
                  • 应该是 16 天,因为 7 月 1 日和 7 月 17 日相隔 16 天,而 7 月 1 日和 7 月 18 日相隔 17 天
                  • @MichaelBorgwardt 你有两个固定日期,我看不出夏令时会如何影响这一点。
                  • @Andy:如果“solid”是指“字面意思”,当然,但问题是“例如”,而不是“我需要 2011 年这些特定日期的解决方案并且不在乎对于其他日期可能出现的任何问题”。
                  【解决方案10】:

                  Use 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-&gt;days 以整数形式获取间隔。

                  【讨论】:

                  • 这似乎不适用于我的初始字符串 "2011/07/01" 和 "2011/07/17" ... "Call to undefined function date_diff().." 。我正在使用 PHP 5.2.10
                  • 根据文档(链接在顶部),这是 PHP >= 5.3.0。下次,请在您的问题中包含 PHP 版本。
                  • 只有在您的日期时间中没有时间时才有效,否则它可能会返回 1-2 天到少数
                  • 错误:$interval->days 返回 6015 天!如果我使用 $interval->format("%d"),它只返回天之间的差异,而不考虑月份和年份。
                  • 请注意,如果要在计数中同时包含开始日和结束日,则需要在结果中加 1。
                  【解决方案11】:

                  PHP 有一个 date_diff() 函数来执行此操作。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-02-26
                    • 2010-10-07
                    • 2015-02-26
                    • 2019-09-27
                    相关资源
                    最近更新 更多