预期的输入:

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

预期的输出:

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

当前回答

使用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');

$日期包含:

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

其他回答

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

这很简短,而且应该在PHP4+中工作。

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

这是另一个解决方案。请核对一下。

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

我喜欢一句俏皮话!

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

请注意,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');

运行演示

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