【问题标题】:PHP: Return all dates between two dates in an array [duplicate]PHP:返回数组中两个日期之间的所有日期[重复]
【发布时间】:2010-11-30 10:03:05
【问题描述】:

预期输入:

getDatesFromRange( '2010-10-01', '2010-10-05' );

预期输出:

Array( '2010-10-01', '2010-10-02', '2010-10-03', '2010-10-04', '2010-10-05' )

【问题讨论】:

    标签: php datetime date-range


    【解决方案1】:

    您还可以查看DatePeriod 类:

    $period = new DatePeriod(
         new DateTime('2010-10-01'),
         new DateInterval('P1D'),
         new DateTime('2010-10-05')
    );
    

    这应该会给你一个包含 DateTime 对象的数组。

    迭代

    foreach ($period as $key => $value) {
        //$value->format('Y-m-d')       
    }
    

    【讨论】:

    • 请注意,这并不能完全为您提供DateTime 对象的数组;它会为您提供一个实现Traversable 接口的DatePeriod 对象。如果您只是计划使用foreach 迭代日期列表,那就太好了;但除此之外,您无论如何都需要使用 foreach 来构建您自己的数组。
    • …或者,事实证明,您可以使用iterator_to_array($period) 来获取您的数组。这个函数在所有DateInterval可用的PHP版本中都可用。
    • foreach( $period as $date) { $array[] = $date->format('Y-m-d'); } 将生成所需的数组。
    • 尽管它是一段不错的代码,DatePeriod 类不包括结束日期。 $period 不包括“2010-10-05”。您可以使用第 4 个参数DatePeriod::EXCLUDE_START_DATE 排除开始日期。最后,它甚至不返回字符串数组(如要求的那样)。很好的答案,但问错了问题。
    • 要包含结束日期,您需要添加时间,例如new DateTime('2010-10-05 23:59:59')
    【解决方案2】:
    function createDateRangeArray($strDateFrom,$strDateTo)
    {
        // takes two dates formatted as YYYY-MM-DD and creates an
        // inclusive array of the dates between the from and to dates.
    
        // could test validity of dates here but I'm already doing
        // that in the main script
    
        $aryRange = [];
    
        $iDateFrom = mktime(1, 0, 0, substr($strDateFrom, 5, 2), substr($strDateFrom, 8, 2), substr($strDateFrom, 0, 4));
        $iDateTo = mktime(1, 0, 0, substr($strDateTo, 5, 2), substr($strDateTo, 8, 2), substr($strDateTo, 0, 4));
    
        if ($iDateTo >= $iDateFrom) {
            array_push($aryRange, date('Y-m-d', $iDateFrom)); // first entry
            while ($iDateFrom<$iDateTo) {
                $iDateFrom += 86400; // add 24 hours
                array_push($aryRange, date('Y-m-d', $iDateFrom));
            }
        }
        return $aryRange;
    }
    

    来源:http://boonedocks.net/mike/archives/137-Creating-a-Date-Range-Array-with-PHP.html

    【讨论】:

    • 使其递归if ($iDateTo&gt;=$iDateFrom){... }else{ return $this-&gt;createDateRangeArray($strDateTo, $strDateFrom); }
    • 当跨越秋季夏令时的星期日 - 星期一时,这似乎在数组末尾添加了一个额外的日期。
    • 以示例失败:createDateRangeArray('2016-10-30','2016-11-01')
    • @Kelvin 我刚刚测试了createDateRangeArray('2016-10-30','2016-11-01'),它输出了正确的三个日期。你能提供一个在线演示来证明这个失败吗?
    • 在跨越 DST 时修复额外一天的方法是在推送 if($iDateFrom&lt;=$iDateTo { /* push to $aryRange */ } 之前再次检查。这是因为在我测试过的一些服务器上,添加小时数会使 $iDateFrom 超出 $iDateTo。
    【解决方案3】:

    这非常灵活。

    /**
     * Creating date collection between two dates
     *
     * <code>
     * <?php
     * # Example 1
     * date_range("2014-01-01", "2014-01-20", "+1 day", "m/d/Y");
     *
     * # Example 2. you can use even time
     * date_range("01:00:00", "23:00:00", "+1 hour", "H:i:s");
     * </code>
     *
     * @author Ali OYGUR <alioygur@gmail.com>
     * @param string since any date, time or datetime format
     * @param string until any date, time or datetime format
     * @param string step
     * @param string date of output format
     * @return array
     */
    function date_range($first, $last, $step = '+1 day', $output_format = 'd/m/Y' ) {
    
        $dates = array();
        $current = strtotime($first);
        $last = strtotime($last);
    
        while( $current <= $last ) {
    
            $dates[] = date($output_format, $current);
            $current = strtotime($step, $current);
        }
    
        return $dates;
    }
    

    【讨论】:

    • 注意仅用于输出的format 参数。这意味着您输入的日期可能与用作参数的format 无关。
    • @Maxime 你说得对。我会更新文档。
    • 绝对简单而精彩!我希望看到此解决方案与面向对象解决方案之间的 Web 请求内存和速度比较。
    • 当心 strtotime()。虽然它在正常年份正常工作,但在我的情况下,它不包括在闰年内计算时的最后日期。我认为这与二月份的额外一天有关。
    • 此示例不支持以下场景:1.$first = '2020-11-26'; $last = '2020-11-26'; 2.$first = '2020-11-26 13:00:00'; $last = '2020-11-26 14:00:00';
    【解决方案4】:

    请注意,ViNce 提供的答案不包括该期间的结束日期

    如果您使用的是 PHP 5.3+,最好的办法是使用这样的函数:

    /**
     * Generate an array of string dates between 2 dates
     *
     * @param string $start Start date
     * @param string $end End date
     * @param string $format Output format (Default: Y-m-d)
     *
     * @return array
     */
    function getDatesFromRange($start, $end, $format = 'Y-m-d') {
        $array = array();
        $interval = new DateInterval('P1D');
    
        $realEnd = new DateTime($end);
        $realEnd->add($interval);
    
        $period = new DatePeriod(new DateTime($start), $interval, $realEnd);
    
        foreach($period as $date) { 
            $array[] = $date->format($format); 
        }
    
        return $array;
    }
    

    然后,您将按预期调用该函数:

    getDatesFromRange('2010-10-01', '2010-10-05');
    

    Run demo

    DatePeriod 类注意事项:您可以使用 DatePeriod 的第 4 个参数来排除开始日期 (DatePeriod::EXCLUDE_START_DATE),但此时不能包含结束日期。 p>

    【讨论】:

    • 请不要编辑其他答案来宣传您的答案。可以在答案中添加评论。
    • 我使用了社区支持的提供的代码,并花时间调试并找出它为什么不起作用。目标是避免其他用户花时间在一个不起作用的“好代码”上,并提供一个真实而完整的答案。令人遗憾的是,我的编辑在一个赞成的答案中被删除,这会误导社区,因为人们未经测试就赞成。这不是关于我的答案,而是关于答案。无论如何...
    • 无需创建2个DateInterval对象; you can make this work with only one(微优化,但仍然)。
    • 感谢您拯救我的一天。
    • 这太棒了!!!效果很好
    【解决方案5】:

    简单但有魅力:

        $period = new DatePeriod(new DateTime('2015-01-01'), new DateInterval('P1D'), new DateTime('2015-01-15 +1 day'));
        foreach ($period as $date) {
            $dates[] = $date->format("Y-m-d");
        }
    
        //ONLY SHOWING
        echo '<pre>';
        var_dump($dates);
        echo '</pre>';
        exit();
    

    【讨论】:

      【解决方案6】:
        function GetDays($sStartDate, $sEndDate){  
            // Firstly, format the provided dates.  
            // This function works best with YYYY-MM-DD  
            // but other date formats will work thanks  
            // to strtotime().  
            $sStartDate = gmdate("Y-m-d", strtotime($sStartDate));  
            $sEndDate = gmdate("Y-m-d", strtotime($sEndDate));  
      
            // Start the variable off with the start date  
           $aDays[] = $sStartDate;  
      
           // Set a 'temp' variable, sCurrentDate, with  
           // the start date - before beginning the loop  
           $sCurrentDate = $sStartDate;  
      
           // While the current date is less than the end date  
           while($sCurrentDate < $sEndDate){  
             // Add a day to the current date  
             $sCurrentDate = gmdate("Y-m-d", strtotime("+1 day", strtotime($sCurrentDate)));  
      
             // Add this new day to the aDays array  
             $aDays[] = $sCurrentDate;  
           }  
      
           // Once the loop has finished, return the  
           // array of days.  
           return $aDays;  
         }  
      

      使用喜欢

      GetDays('2007-01-01', '2007-01-31'); 
      

      【讨论】:

        【解决方案7】:

        这很简短,很贴心,应该可以在 PHP4+ 中使用。

        function getDatesFromRange($start, $end){
            $dates = array($start);
            while(end($dates) < $end){
                $dates[] = date('Y-m-d', strtotime(end($dates).' +1 day'));
            }
            return $dates;
        }
        

        【讨论】:

        • 不幸的是,这个巧妙的解决方案增加了一天太多...
        • Peavey,不,它没有......
        • 此解决方案非常棒,只要您不关心它不可避免地会运行太长时间并导致脚本运行直到达到 max_execution_time。
        • dctucker,听起来你发明了一个问题。
        • dctucker 是对的。这就是我从这个函数中得到的“致命错误:允许的 134217728 字节的内存大小已用尽(试图分配 32 字节)”
        【解决方案8】:

        必须添加 $end->modify('+1 day') 以包括间隔的最后一天,例如一月如果不使用 modify() 方法,将有 31 天而不是 30 天。 此版本的代码将包含间隔的最后一天:

        $begin = new DateTime( '2018-08-01' );
        $end = new DateTime( '2018-08-31' );
        $end = $end->modify( '+1 day' ); 
        
        $interval = new DateInterval('P1D');
        $daterange = new DatePeriod($begin, $interval ,$end);
        
        foreach($daterange as $date){
            echo $date->format("Ymd") . "<br>";
        }
        

        PHP doc link

        【讨论】:

          【解决方案9】:

          短函数。 PHP 5.3 及更高版本。可以采用 strtotime 可以理解的任何日期格式的可选第三个参数。如果 end

          function getDatesFromRange($start, $end, $format='Y-m-d') {
              return array_map(function($timestamp) use($format) {
                  return date($format, $timestamp);
              },
              range(strtotime($start) + ($start < $end ? 4000 : 8000), strtotime($end) + ($start < $end ? 8000 : 4000), 86400));
          }
          

          测试:

          date_default_timezone_set('Europe/Berlin');
          print_r(getDatesFromRange( '2016-7-28','2016-8-2' ));
          print_r(getDatesFromRange( '2016-8-2','2016-7-28' ));
          print_r(getDatesFromRange( '2016-10-28','2016-11-2' ));
          print_r(getDatesFromRange( '2016-11-2','2016-10-28' ));
          print_r(getDatesFromRange( '2016-4-2','2016-3-25' ));
          print_r(getDatesFromRange( '2016-3-25','2016-4-2' ));
          print_r(getDatesFromRange( '2016-8-2','2016-7-25' ));
          print_r(getDatesFromRange( '2016-7-25','2016-8-2' ));
          

          输出:

          Array ( [0] => 2016-07-28 [1] => 2016-07-29 [2] => 2016-07-30 [3] => 2016-07-31 [4] => 2016-08-01 [5] => 2016-08-02 ) 
          Array ( [0] => 2016-08-02 [1] => 2016-08-01 [2] => 2016-07-31 [3] => 2016-07-30 [4] => 2016-07-29 [5] => 2016-07-28 ) 
          Array ( [0] => 2016-10-28 [1] => 2016-10-29 [2] => 2016-10-30 [3] => 2016-10-31 [4] => 2016-11-01 [5] => 2016-11-02 ) 
          Array ( [0] => 2016-11-02 [1] => 2016-11-01 [2] => 2016-10-31 [3] => 2016-10-30 [4] => 2016-10-29 [5] => 2016-10-28 ) 
          Array ( [0] => 2016-04-02 [1] => 2016-04-01 [2] => 2016-03-31 [3] => 2016-03-30 [4] => 2016-03-29 [5] => 2016-03-28 [6] => 2016-03-27 [7] => 2016-03-26 [8] => 2016-03-25 ) 
          Array ( [0] => 2016-03-25 [1] => 2016-03-26 [2] => 2016-03-27 [3] => 2016-03-28 [4] => 2016-03-29 [5] => 2016-03-30 [6] => 2016-03-31 [7] => 2016-04-01 [8] => 2016-04-02 ) 
          Array ( [0] => 2016-08-02 [1] => 2016-08-01 [2] => 2016-07-31 [3] => 2016-07-30 [4] => 2016-07-29 [5] => 2016-07-28 [6] => 2016-07-27 [7] => 2016-07-26 [8] => 2016-07-25 ) 
          Array ( [0] => 2016-07-25 [1] => 2016-07-26 [2] => 2016-07-27 [3] => 2016-07-28 [4] => 2016-07-29 [5] => 2016-07-30 [6] => 2016-07-31 [7] => 2016-08-01 [8] => 2016-08-02 )
          

          【讨论】:

            【解决方案10】:

            完成这项工作的方法有很多,但最终这一切都取决于您使用的 PHP 版本。以下是所有解决方案的摘要:

            获取 PHP 版本:

            echo phpinfo();
            

            PHP 5.3+

            $period = new DatePeriod(
                 new DateTime('2010-10-01'),
                 new DateInterval('P1D'),
                 new DateTime('2010-10-05')
            );
            

            PHP 4+

            /**
             * creating between two date
             * @param string since
             * @param string until
             * @param string step
             * @param string date format
             * @return array
             * @author Ali OYGUR <alioygur@gmail.com>
             */
            function dateRange($first, $last, $step = '+1 day', $format = 'd/m/Y' ) { 
            
                $dates = array();
                $current = strtotime($first);
                $last = strtotime($last);
            
                while( $current <= $last ) { 
            
                    $dates[] = date($format, $current);
                    $current = strtotime($step, $current);
                }
            
                return $dates;
            }
            

            PHP

            你应该升级:)

            【讨论】:

            • PHP 5.3+ 解决方案不会返回所有日期,也不会以预期的方式(字符串数组)返回。 PHP 4+ 具有误导性,因为 format 参数仅用于输出(而不是输入参数)。
            • 我同意马克西姆的观点。 PHP 5.3+ 的方法将$period 声明为一个在这种情况下确实臃肿且无用的对象。绝对没有生成日期范围数组。 sandbox.onlinephpfunctions.com/code/… 投反对票,直至更正。与PHP 4+ dateRange()相比,此页面提供了更时尚的功能。
            【解决方案11】:

            这是一个函数,它将返回双向日期范围,它适用于PHP >=5.2.2

            function createRange($start, $end, $format = 'Y-m-d') {
                $start  = new DateTime($start);
                $end    = new DateTime($end);
                $invert = $start > $end;
            
                $dates = array();
                $dates[] = $start->format($format);
                while ($start != $end) {
                    $start->modify(($invert ? '-' : '+') . '1 day');
                    $dates[] = $start->format($format);
                }
                return $dates;
            }
            

            使用示例:

            print_r(createRange('2010-10-01', '2010-10-05'));
            /*Array
            (
                [0] => 2010-10-01
                [1] => 2010-10-02
                [2] => 2010-10-03
                [3] => 2010-10-04
                [4] => 2010-10-05
            )*/
            
            print_r(createRange('2010-10-05', '2010-10-01', 'j M Y'));
            /*Array
            (
                [0] => 5 Oct 2010
                [1] => 4 Oct 2010
                [2] => 3 Oct 2010
                [3] => 2 Oct 2010
                [4] => 1 Oct 2010
            )*/
            

            demo

            【讨论】:

              【解决方案12】:
              // Specify the start date. This date can be any English textual format  
              $date_from = "2018-02-03";   
              $date_from = strtotime($date_from); // Convert date to a UNIX timestamp  
              
              // Specify the end date. This date can be any English textual format  
              $date_to = "2018-09-10";  
              $date_to = strtotime($date_to); // Convert date to a UNIX timestamp  
              
              // Loop from the start date to end date and output all dates inbetween  
              for ($i=$date_from; $i<=$date_to; $i+=86400) {  
                  echo date("Y-m-d", $i).'<br />';  
              } 
              

              【讨论】:

                【解决方案13】:
                <?
                print_r(getDatesFromRange( '2010-10-01', '2010-10-05' ));
                
                function getDatesFromRange($startDate, $endDate)
                {
                    $return = array($startDate);
                    $start = $startDate;
                    $i=1;
                    if (strtotime($startDate) < strtotime($endDate))
                    {
                       while (strtotime($start) < strtotime($endDate))
                        {
                            $start = date('Y-m-d', strtotime($startDate.'+'.$i.' days'));
                            $return[] = $start;
                            $i++;
                        }
                    }
                
                    return $return;
                }
                

                【讨论】:

                  【解决方案14】:

                  使用 DateTime 对象的 PHP 5.2 解决方案。但 startDate 必须在 endDate 之前。

                  function createRange($startDate, $endDate) {
                      $tmpDate = new DateTime($startDate);
                      $tmpEndDate = new DateTime($endDate);
                  
                      $outArray = array();
                      do {
                          $outArray[] = $tmpDate->format('Y-m-d');
                      } while ($tmpDate->modify('+1 day') <= $tmpEndDate);
                  
                      return $outArray;
                  }
                  

                  使用:

                  $dates = createRange('2010-10-01', '2010-10-05');
                  

                  $dates 包含:

                  Array( '2010-10-01', '2010-10-02', '2010-10-03', '2010-10-04', '2010-10-05' )       
                  

                  【讨论】:

                  • 贝娄PHP版本demo.
                  【解决方案15】:
                  function createDateRangeArray($start, $end) {
                  // Modified by JJ Geewax
                  
                  $range = array();
                  
                  if (is_string($start) === true) $start = strtotime($start);
                  if (is_string($end) === true ) $end = strtotime($end);
                  
                  if ($start > $end) return createDateRangeArray($end, $start);
                  
                  do {
                  $range[] = date('Y-m-d', $start);
                  $start = strtotime("+ 1 day", $start);
                  }
                  while($start < $end);
                  
                  return $range;
                  } 
                  

                  来源:http://boonedocks.net/mike/archives/137-Creating-a-Date-Range-Array-with-PHP.html

                  【讨论】:

                    【解决方案16】:

                    这是一种使用 Carbon https://github.com/briannesbitt/Carbon 的方法:

                    public function buildDateRangeArray($first, $last)
                    {
                        while ($first <= $last) {
                            $dates[] = $first->toDateString();
                    
                            $first->addDay();
                        }
                    
                        return $dates;
                    }
                    

                    当然,这可以调整为不使用 Carbon。传递给函数的 $first 和 $last 参数是 Carbon 实例。

                    【讨论】:

                      【解决方案17】:
                      // will return dates array
                      function returnBetweenDates( $startDate, $endDate ){
                          $startStamp = strtotime(  $startDate );
                          $endStamp   = strtotime(  $endDate );
                      
                          if( $endStamp > $startStamp ){
                              while( $endStamp >= $startStamp ){
                      
                                  $dateArr[] = date( 'Y-m-d', $startStamp );
                      
                                  $startStamp = strtotime( ' +1 day ', $startStamp );
                      
                              }
                              return $dateArr;    
                          }else{
                              return $startDate;
                          }
                      
                      }
                      
                      returnBetweenDates( '2014-09-16', '2014-09-26' );
                      
                      // print_r( returnBetweenDates( '2014-09-16', '2014-09-26' ) );
                      

                      它将返回如下数组:

                      Array
                      (
                          [0] => 2014-09-16
                          [1] => 2014-09-17
                          [2] => 2014-09-18
                          [3] => 2014-09-19
                          [4] => 2014-09-20
                          [5] => 2014-09-21
                          [6] => 2014-09-22
                          [7] => 2014-09-23
                          [8] => 2014-09-24
                          [9] => 2014-09-25
                          [10] => 2014-09-26
                      )
                      

                      【讨论】:

                      • 您能否也显示您的输出,请证明您的代码按预期工作。
                      • 感谢您的关注。这个函数返回数组,你可以在我用输出编辑答案时检查。
                      • 那么你的解决方案和例如有什么区别? @RobertPitt 或 HaimEvgi 的答案?为什么这个答案与所有​​现有答案不同?这个答案似乎没有添加任何新内容。仅当您添加新知识或为问题提供不同的解决方案时,您才应该提供答案。如果您无法激励新事物,请删除此答案,但请不要气馁。 How-to-answer 将来可能有用。
                      • 好的,没问题,谢谢提示。
                      【解决方案18】:
                      $report_starting_date=date('2014-09-16');
                      $report_ending_date=date('2014-09-26');
                      $report_starting_date1=date('Y-m-d',strtotime($report_starting_date.'-1 day'));
                      while (strtotime($report_starting_date1)<strtotime($report_ending_date))
                      {
                      
                          $report_starting_date1=date('Y-m-d',strtotime($report_starting_date1.'+1 day'));
                          $dates[]=$report_starting_date1;
                        } 
                        print_r($dates);
                      
                       // dates    ('2014-09-16', '2014-09-26')
                      
                      
                       //print result    Array
                      (
                      [0] => 2014-09-16
                      [1] => 2014-09-17
                      [2] => 2014-09-18
                      [3] => 2014-09-19
                      [4] => 2014-09-20
                      [5] => 2014-09-21
                      [6] => 2014-09-22
                      [7] => 2014-09-23
                      [8] => 2014-09-24
                      [9] => 2014-09-25
                      [10] => 2014-09-26
                      )
                      

                      【讨论】:

                      • 请编辑您的答案并提供更多详细信息,并更正格式。
                      【解决方案19】:

                      我认为这是最短的答案

                      根据需要编辑代码

                      for ($x=strtotime('2015-12-01');$x<=strtotime('2015-12-30');$x+=86400)
                      echo date('Y-m-d',$x);
                      

                      【讨论】:

                      • 这不仅不会产生问题中要求的数组。当时区设置为 ('Europe/Berlin') 并且日期范围为 2016-10-30 到 2016-11-01 时,此答案会中断。 sandbox.onlinephpfunctions.com/code/…
                      【解决方案20】:

                      我喜欢坚固的单线!

                      我当天的 php 发现是 array_push() 返回数组中的新元素数。

                      我设法在一个空的 while 循环的两部分条件语句中检查结束日期匹配、增加 $x 并推送新元素。

                      function getDatesFromRange($a,$b,$x=0,$dates=[]){
                          while(end($dates)!=$b && $x=array_push($dates,date("Y-m-d",strtotime("$a +$x day"))));
                          return $dates;
                      }
                      var_export(getDatesFromRange('2010-10-01','2010-10-05'));
                      

                      在这个页面上与我最相似的功能是 drolex 的(如果你相信我的话,直到我写了我的之后我才真正找到它)。我在大大小小的日期范围内进行了一些速度测试,它们似乎经常互相击败——所以我称它们为同等表现者。以下是其他一些比较:

                      • 我们都使用date()strtotime() 和两个数组函数。
                      • Drolex 只使用三个变量,我使用相同的三个加上$x
                      • 因为我的函数不需要将开始日期加载到 $date 数组中,所以我可以在函数参数中声明它并保留行(与 $x 一样)。

                      **只是几个重要说明:

                      1- 日期字符串在输入函数之前必须经过验证。

                      2- 上述函数只能处理向前移动的日期范围。 如果您想要向后移动日期范围,只需在函数调用中颠倒日期顺序并在$x= 之后添加一个减号。(很漂亮,嗯?)

                      function getDatesFromRange($a,$b,$x=0,$dates=[]){
                          while(end($dates)!=$b && $x=-array_push($dates,date("Y-m-d",strtotime("$a +$x day"))));
                          return $dates;
                      }
                      var_export(getDatesFromRange('2010-10-05','2010-10-01'));
                      

                      另一个扩展/考虑...

                      假设您有一个多元文化(或草率)的用户群,并且您的函数必须能够接收不同有效格式的开始和结束日期,并且您需要能够以任何有效格式输出数组?通过细微的调整,我已经为此提供了解决方案。

                      “有效”是指YYYY-MM-DDMM/DD/YYYDD-MM-YYYY,这些是世界范围内非常流行的标准,如果需要其他格式,那么可用性将归结为strtotime 对它的理解.

                      这里是Demo

                      代码:

                      function getDatesFromRange($a,$b,$format='Y-m-d',$dates=[],$x=0){
                          while(date($format,strtotime(end($dates)))!=date($format,strtotime($b)) && $x=array_push($dates,date($format,strtotime("$a +$x day"))));
                          return $dates;
                      }
                      
                      $formats=array("Computer"=>'Y-m-d',"American"=>'m/d/Y','Non-American'=>'d-m-Y');
                      $start='15-02-2017';    // Non-American formatted start date
                      $end='2017-02-27';  // Computer formatted start date
                      foreach($formats as $label=>$format){
                          echo "<br>$label<br>";
                          var_export(getDatesFromRange($start,$end,$format));
                          echo "<br>";
                      }
                      

                      输出

                      Computer
                      array ( 0 => '2017-02-15', 1 => '2017-02-16', 2 => '2017-02-17', 3 => '2017-02-18',
                              4 => '2017-02-19', 5 => '2017-02-20', 6 => '2017-02-21', 7 => '2017-02-22',
                              8 => '2017-02-23', 9 => '2017-02-24', 10 => '2017-02-25', 11 => '2017-02-26',
                              12 => '2017-02-27', )
                      
                      American
                      array ( 0 => '02/15/2017', 1 => '02/16/2017', 2 => '02/17/2017', 3 => '02/18/2017',
                              4 => '02/19/2017', 5 => '02/20/2017', 6 => '02/21/2017', 7 => '02/22/2017',
                              8 => '02/23/2017', 9 => '02/24/2017', 10 => '02/25/2017', 11 => '02/26/2017',
                              12 => '02/27/2017', )
                      
                      Non-American
                      array ( 0 => '15-02-2017', 1 => '16-02-2017', 2 => '17-02-2017', 3 => '18-02-2017',
                              4 => '19-02-2017', 5 => '20-02-2017', 6 => '21-02-2017', 7 => '22-02-2017',
                              8 => '23-02-2017', 9 => '24-02-2017', 10 => '25-02-2017', 11 => '26-02-2017',
                              12 => '27-02-2017', )
                      

                      现在有些人不是 100% 信任 strtotime() 因为一些错误的行为。我想我已经读过,当试图从闰日跳一个月时,它会犯规。但是,除非有人可以重现它以证明我错了,否则当您只增加一天时,strtotime() 永远不会让您失望。

                      【讨论】:

                      • 上帝保佑记录良好的答案。 +1
                      • 这对我来说更像是一个学术挑战。我无法想象在生产代码中使用这种技术。如果你认真对待你的项目,我会推荐一个 datetime 对象。
                      • 好吧,至少我很感激你的努力。为你鼓掌。 @mickmackusa
                      【解决方案21】:

                      这是另一种解决方案。请检查这个。

                      $first = '10/30/2017'; //starting date
                      $last= '10/11/2017';   //ending date
                      $first_time_arr=explode('/',$first); 
                      $last_time_arr=explode('/',$last);
                      //create timestamp of starting date
                      $start_timestamp=mktime(0,0,0, $first_time_arr[0], $first_time_arr[1],$first_time_arr[2]);
                      //create timestamp of ending date
                      $end_timestamp=mktime(0,0,0, $last_time_arr[0], $last_time_arr[1],$last_time_arr[2]);
                      $date_arr=array();
                      for($i=$start_timestamp;$i<=$end_timestamp;$i=$i+86400){
                          $date_arr[]=date("Y-m-d",$i); //this will save all dates in array
                      }
                      

                      【讨论】:

                        【解决方案22】:
                        public static function countDays($date1,$date2)
                        {
                            $date1 = strtotime($date1); // or your date as well
                            $date2 = strtotime($date2);
                            $datediff = $date1 - $date2;
                            return floor($datediff/(60*60*24));
                        }
                        
                        public static function dateRange($date1,$date2)
                        {
                            $count = static::countDays($date1,$date2) + 1;
                            $dates = array();
                            for($i=0;$i<$count;$i++)
                            {
                                $dates[] = date("Y-m-d",strtotime($date2.'+'.$i.' days'));
                            }
                            return $dates;
                        }
                        

                        【讨论】:

                          【解决方案23】:
                          function datesbetween ($date1,$date2)
                          {
                              $dates= array();
                              for ($i = $date1
                                 ; $i<= $date1
                                 ; $i=date_add($i, date_interval_create_from_date_string('1 days')) ) 
                              {            
                                 $dates[] = clone $i;
                              }
                              return $dates;
                          }
                          

                          【讨论】:

                          • 我认为这是最简单的方法
                          • 请说明您的答案是如何解决问题的,它将帮助大家更清楚地理解您的解决方案,以供将来参考。
                          【解决方案24】:

                          为了使穆斯塔法的回答完整,这绝对是最简单和最有效的方法:

                          function getDatesFromRange($start_date, $end_date, $date_format = 'Y-m-d')
                             {
                                $dates_array = array();
                                for ($x = strtotime($start_date); $x <= strtotime($end_date); $x += 86400) {
                                   array_push($dates_array, date($date_format, $x));
                                }
                          
                                return $dates_array;
                             }
                          
                             // see the dates in the array
                             print_r( getDatesFromRange('2017-02-09', '2017-02-19') );
                          

                          如果在调用函数时添加第三个参数,您甚至可以更改默认输出日期格式,否则它将使用设置为“Y-m-d”的默认格式。

                          希望对你有帮助:)

                          【讨论】:

                          【解决方案25】:
                          function getWeekdayDatesFrom($format, $start_date_epoch, $end_date_epoch, $range) {
                          
                              $dates_arr = array();
                          
                              if( ! $range) {
                                  $range = round(abs($start_date_epoch-$end_date_epoch)/86400) + 1;
                              } else {
                                  $range = $range + 1; //end date inclusive
                              }
                          
                              $current_date_epoch = $start_date_epoch;
                          
                              for($i = 1; $i <= $range; $i+1) {
                          
                                  $d = date('N',  $current_date_epoch);
                          
                                  if($d <= 5) { // not sat or sun
                                      $dates_arr[] = "'".date($format, $current_date_epoch)."'";
                                  }
                          
                                  $next_day_epoch = strtotime('+'.$i.'day', $start_date_epoch);
                                  $i++;
                                  $current_date_epoch = $next_day_epoch;
                          
                              }
                          
                              return $dates_arr;
                          } 
                          

                          【讨论】:

                          • 这应该回答问题,然后一些。使用此函数,您可以声明返回格式(即 Y-m-d),声明开始日期和结束日期或开始日期和范围。我目前已将其设置为包含结束日期,并且默认情况下仅返回工作日(可以轻松撤消)。
                          • 如果给出错误的原因,在许多情况下,错误答案与正确答案一样有用。如果你要投反对票,你应该给出一个理由。不过,我的回答并没有错。这也是一个公平的答案。
                          • 当时区设置为 Europe/Berlin 且日期范围为 2016-10-30 至 2016-11-01 时,此答案注定失败。此外,没有指定要为$format$start_date_epoch$end_date_epoch$range 输入的值的函数调用。请编辑或删除此答案。
                          【解决方案26】:
                          $arr = range(strtotime("2013-12-01"),strtotime("2013-12-31"), "86400");
                          array_walk_recursive($arr, function(&$element) { $element = date("Y-m-d", $element); });
                          print_r ($arr);
                          

                          【讨论】:

                          • 请添加一些英文以澄清您的答案。
                          • 当时区设置为 ('Europe/Berlin') 并且日期范围是 2016-10-30 到 2016-11-01 时,此答案会中断。 sandbox.onlinephpfunctions.com/code/…
                          猜你喜欢
                          • 1970-01-01
                          • 2011-11-08
                          • 1970-01-01
                          • 1970-01-01
                          • 2013-06-14
                          • 1970-01-01
                          相关资源
                          最近更新 更多