我有2个日期
$st_date = '2012-07-20';
$ed_date = '2012-07-27';
我想显示从$st_date
到$ed_date
的所有日期
为:
2012-07-20
2012-07-21
2012-07-22
2012-07-23
2012-07-24
2012-07-25
2012-07-26
2012-07-27
我认为首先计算差异,运行foreach<计算,并将$ i day添加到$ st_date 但我不想循环,它增加了代码。任何一个返回所有日期数组的直接日期()。
答案 0 :(得分:3)
试试这段代码:
<?php
$st_date = '2012-07-20';
$ed_date = '2012-07-27';
$dateMonthYearArr = array();
$st_dateTS = strtotime($st_date);
$ed_dateTS = strtotime($ed_date);
for ($currentDateTS = $st_dateTS; $currentDateTS <= $ed_dateTS; $currentDateTS += (60 * 60 * 24)) {
// use date() and $currentDateTS to format the dates in between
$currentDateStr = date(“Y-m-d”,$currentDateTS);
$dateMonthYearArr[] = $currentDateStr;
//print $currentDateStr.”<br />”;
}
echo “<pre>”;
print_r($dateMonthYearArr);
echo “</pre>”;
?>
答案 1 :(得分:3)
虽然我不理解你对循环的厌恶,但我确实理解尽可能地隐藏代码。
为此,我将扩展PHP的DateTime对象以提供您所需的功能。这样的事情: -
class MyDateTime extends DateTime
{
/**
* Creates an array of date strings of all days between
* the current date object and $endDate
*
* @param DateTime $endDate
* @return array of date strings
*/
public function rangeOfDates(DateTime $endDate)
{
$result = array();
$interval = new DateInterval('P1D');
//Add a day as iterating over the DatePeriod
//misses the last day for some strange reason
//See here http://www.php.net/manual/en/class.dateperiod.php#102629
$endDate->add($interval);
$period = new DatePeriod($this, $interval, $endDate);
foreach($period as $day){
$result[] = $day->format('Y-m-j');
}
return $result;
}
}
然后,当您想要使用它时,您可以这样做: -
$st_date = new MyDateTime("2012-07-20");
$en_date = new DateTime("2012-07-27");
$dates = $st_date->rangeOfDates($en_date);
var_dump($dates);
将提供以下输出: -
array
0 => string '2012-07-20' (length=10)
1 => string '2012-07-21' (length=10)
2 => string '2012-07-22' (length=10)
3 => string '2012-07-23' (length=10)
4 => string '2012-07-24' (length=10)
5 => string '2012-07-25' (length=10)
6 => string '2012-07-26' (length=10)
7 => string '2012-07-27' (length=10)
虽然不幸的是,你可能需要一个循环来迭代该数组:)
显然,这个解决方案使用循环来实现它的目标,但是它们被封装在一个很好的可重用代码中。
有关详细信息,请参阅DateTime,DateInterval和DatePeriod上的PHP手册。这些页面的评论中有很多提示。
答案 2 :(得分:2)
$start = strtotime('2009-02-01');
$end = strtotime('2009-03-10');
$range = array();
$date = strtotime("-1 day", $start);
while($date < $end) {
$date = strtotime("+1 day", $date);
$range[] = date('Y-m-d', $date);
}
答案 3 :(得分:1)
$st_date = '2012-07-20';
$ed_date = '2012-07-27';
for($i=$st_date;$i<=$ed_date;$i++)echo $i."<br />";
答案 4 :(得分:1)
没有循环使用range()&amp; array_map():
编辑:有点错误,你必须跳86400,因为1天= 86400秒,所以代码现在应该没问题:) $st_date = '2012-07-20';
$ed_date = '2012-07-27';
$dates = range(strtotime($st_date), strtotime($ed_date),86400);
$range_of_dates = array_map("toDate", $dates);
print_r($range_of_dates);
function toDate($x){return date('Y-m-d', $x);}
?>
答案 5 :(得分:0)
参加派对的时间已经很晚了,但是之前正在解决这个问题并且使用以下内容进行处理,这比其他示例更清晰,因此将其添加为人们的选项;
function dateRange($from, $to)
{
return array_map(function($arg) {
return date('Y-m-d', $arg);
}, range(strtotime($from), strtotime($to), 86400));
}
用法:
$dates = dateRange('2017-01-01', '2017-01-08');
返回:
Array
(
[0] => 2017-01-01
[1] => 2017-01-02
[2] => 2017-01-03
[3] => 2017-01-04
[4] => 2017-01-05
[5] => 2017-01-06
[6] => 2017-01-07
[7] => 2017-01-08
)