预期的输入:
getDatesFromRange( '2010-10-01', '2010-10-05' );
预期的输出:
Array( '2010-10-01', '2010-10-02', '2010-10-03', '2010-10-04', '2010-10-05' )
预期的输入:
getDatesFromRange( '2010-10-01', '2010-10-05' );
预期的输出:
Array( '2010-10-01', '2010-10-02', '2010-10-03', '2010-10-04', '2010-10-05' )
当前回答
请注意,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),但此时不能包括结束日期。
其他回答
我喜欢一句俏皮话!
我今天的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()永远不会让你失望。
使用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 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
这里有一种使用Carbon https://github.com/briannesbitt/Carbon:的方法
public function buildDateRangeArray($first, $last)
{
while ($first <= $last) {
$dates[] = $first->toDateString();
$first->addDay();
}
return $dates;
}
当然,这可以被调整为不使用碳。传递给函数的$first和$last参数是Carbon实例。
这是非常灵活的。
/**
* 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;
}