PHP:返回两个日期之间的所有日期数组

295

期望输入:

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

期望输出:

Array( '2010-10-01', '2010-10-02', '2010-10-03', '2010-10-04', '2010-10-05' )
26个回答

8
有很多种方法可以实现这个功能,但最终的结果取决于您正在使用的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 < 4

你应该升级 :)


PHP 5.3+的解决方案不能以预期的方式返回所有日期(字符串数组)。而PHP 4+则存在误导,因为format参数仅用于输出(而非输入参数)。 - Maxime
我同意Maxime的观点。PHP 5.3+的方法将$period声明为一个对象,对于这种情况来说过于臃肿且无用。没有生成任何日期范围数组。http://sandbox.onlinephpfunctions.com/code/a8bf2ac01f79691a3f7ad34d14314fdf8a41445b 在修正之前被投票降级。在此页面上,与PHP 4+ dateRange()相比,有更简洁的函数可用。 - mickmackusa

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

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

4

PHP 5.2的解决方案使用DateTime对象。但是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' )       

1
在 PHP 版本低于 5.3.0 的情况下,这段代码会消耗大量内存,演示 - Glavić

3
这里有一种使用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实例。

3
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

这篇文章介绍了如何使用PHP创建一个日期范围数组。这对于需要在网站上显示一定时间范围内的数据非常有用。作者提供了一个函数,它接受两个日期参数并返回一个包含该日期范围内所有日期的数组。该函数使用strtotime和date函数来计算和格式化日期。

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

请编辑您的答案,更详细地说明您正在做什么,并纠正格式。 - bish

2

我认为这是最简短的答案

根据您的喜好编辑代码

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时会出错。http://sandbox.onlinephpfunctions.com/code/81e57d49b072a63e729a2e5fff5235c8fa845d8f - mickmackusa

2
// 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
)

请您展示一下输出结果,以证明您的代码按预期工作。 - kkuilla
感谢您的关注。此函数返回数组,您可以在我编辑答案时检查输出。 - ashu joshi
1
那么你的解决方案与@RobertPitt或HaimEvgi的答案有什么区别?为什么这个答案与所有现有的答案不同?看起来这个答案没有添加任何新内容。如果您不能说明有什么新的东西,请删除此答案,但请不要灰心。如何回答在未来可能会有用。 - kkuilla
好的,没问题,谢谢你的建议。 - ashu joshi

1
这是另一种解决方案。请检查此内容。
$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
}

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