计算php中2个日期之间的所有日期?

时间:2012-07-19 08:00:14

标签: php date date-arithmetic

我有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 但我不想循环,它增加了代码。任何一个返回所有日期数组的直接日期()。

6 个答案:

答案 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)

虽然不幸的是,你可能需要一个循环来迭代该数组:)

显然,这个解决方案使用循环来实现它的目标,但是它们被封装在一个很好的可重用代码中。

有关详细信息,请参阅DateTimeDateIntervalDatePeriod上的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
)