预期的输入:

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

预期的输出:

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

当前回答

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

其他回答

下面是一个函数,它将从两个方向返回日期范围,适用于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

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

// 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 />';  
} 
  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'); 

我喜欢一句俏皮话!

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

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

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-DD, MM/DD/YYY和DD-MM- yyyy,这些都是全球范围内非常流行的标准,如果需要另一种格式,那么可用性将归结为strtotime对它的理解。

这里是演示。

代码:

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()永远不会让你失望。