php 如何列出两个日期之间的所有月份

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18742998/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 18:08:25  来源:igfitidea点击:

How to list all months between two dates

phpdatedatetime

提问by Pooya

I'm trying to list all months between two dates.

我试图列出两个日期之间的所有月份。

For example; start date is: 2010-12-02and last date is: 2012-05-06

例如; 开始日期是:2010-12-02,最后日期是:2012-05-06

I want to list something like this:

我想列出这样的事情:

2010-12
2011-01
2011-02
2011-03
2011-04
.
.
.
2012-04
2012-05

This is what I have tried and it is not working at all:

这是我尝试过的,但根本不起作用:

    $year_min = 2010;
    $year_max = 2012;
    $month_min = 12;
    $month_max = 5;
    for($y=$year_min; $y<=$year_max; $y++)
    {
        for($m=$month_min; $m<=$month_max; $m++)
        {
            $period[] = $y.$m;
        }
    }

回答by John Conde

PHP 5.3

PHP 5.3

$start    = new DateTime('2010-12-02');
$start->modify('first day of this month');
$end      = new DateTime('2012-05-06');
$end->modify('first day of next month');
$interval = DateInterval::createFromDateString('1 month');
$period   = new DatePeriod($start, $interval, $end);

foreach ($period as $dt) {
    echo $dt->format("Y-m") . "<br>\n";
}

See it in action

看到它在行动

PHP 5.4 or newer

PHP 5.4 或更高版本

$start    = (new DateTime('2010-12-02'))->modify('first day of this month');
$end      = (new DateTime('2012-05-06'))->modify('first day of next month');
$interval = DateInterval::createFromDateString('1 month');
$period   = new DatePeriod($start, $interval, $end);

foreach ($period as $dt) {
    echo $dt->format("Y-m") . "<br>\n";
}

The part where we modify the start and end dates to the first of the month is important. If we didn't, and the current day higher then the last day in February (i.e. 28 in non-leap years, 29 in leap years) this would skip February.

我们将开始和结束日期修改为每月第一天的部分很重要。如果我们没有,并且当前日期高于二月的最后一天(即非闰年为 28,闰年为 29)这将跳过二月。

回答by SteeveDroz

You must make a difference between two months of the same year and two months of different years.

您必须区分同一年的两个月和不同年份的两个月。

$year_min = substr($row['contractStart'], 0, 4);
$year_max = substr($row['contractEnd'], 0, 4);
$month_min = substr($row['contractStart'], 5, 2);
$month_min = substr($row['contractEnd'], 5, 2);
$period = array();
try {
  if ($year_min > $year_max)
    throw new Exception();
  else if ($year_min == $year_max)
    if ($month_min > $month_max)
      throw new Exception();
    for ($month = $month_min; $month <= $month_max; $month++) {
      $period[] = $month . '-' . $year;
    }
  else {
    for ($month = $month_min; $month <= 12; $month++) {
      $period[] = $month . '-' . $year_min;
    }
    for ($year = $year_min + 1; $year < $year_max; $year++) {
      for ($month = $month_min; $month <= $month_max; $month++) {
        $period[] = $month . '-' . $year;
      }
    }
    for ($month = 1; $month <= $month_max; $month++) {
      $period[] = $month . '-' . $year_max;
    }
  }
  implode("<br />\r\n", $period);
}
catch (Exception $e) {
  echo 'Start date occurs after end date.'
}

That's for the hard way. Now there is a quick and easy way that is already given as an answer which I recommend you to choose.

那是艰难的方式。现在有一种快速简便的方法已经作为答案给出,我建议您选择。

回答by sulayman

    function getMonthsInRange($startDate, $endDate) {
$months = array();
while (strtotime($startDate) <= strtotime($endDate)) {
    $months[] = array('year' => date('Y', strtotime($startDate)), 'month' => date('m', strtotime($startDate)), );
    $startDate = date('01 M Y', strtotime($startDate.
        '+ 1 month')); // Set date to 1 so that new month is returned as the month changes.
}

return $months;
}

回答by CptAJ

This was my solution since DateTime is not available in my server environment.

这是我的解决方案,因为 DateTime 在我的服务器环境中不可用。

$a = "2007-01-01";
$b = "2008-02-15";

$i = date("Ym", strtotime($a));
while($i <= date("Ym", strtotime($b))){
    echo $i."\n";
    if(substr($i, 4, 2) == "12")
        $i = (date("Y", strtotime($i."01")) + 1)."01";
    else
        $i++;
}

Try it out: http://3v4l.org/BZOmb

试试看:http: //3v4l.org/BZOmb