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

Php 如何列出两个日期之间的所有月份,php,date,datetime,Php,Date,Datetime,我试着列出两次约会之间的所有月份 比如,;开始日期为:2010-12-02,最后日期为:2012-05-06 我想列出如下内容: 2010-12 2011-01 2011-02 2011-03 2011-04 . . . 2012-04 2012-05 这是我尝试过的,但根本不起作用: $year_min = 2010; $year_max = 2012; $month_min = 12; $month_max = 5; for($y=$year_min

我试着列出两次约会之间的所有月份

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

我想列出如下内容:

2010-12
2011-01
2011-02
2011-03
2011-04
.
.
.
2012-04
2012-05
这是我尝试过的,但根本不起作用:

    $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;
        }
    }
$year\u min=2010;
$year_max=2012年;
$month_min=12;
$month_max=5;

对于($y=$year\u min;$yPHP5.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";
}
$start=newdatetime('2010-12-02');
$start->modify(‘本月第一天’);
$end=新日期时间('2012-05-06');
$end->modify(‘下个月的第一天’);
$interval=DateInterval::createFromDateString('1个月');
$period=newdateperiod($start、$interval、$end);
foreach(期间为$dt){
echo$dt->格式(“Y-m”)。“
\n”; }

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";
}
$start=(新日期时间('2010-12-02'))->modify('本月第一天');
$end=(新日期时间('2012-05-06'))->modify('下个月的第一天');
$interval=DateInterval::createFromDateString('1个月');
$period=newdateperiod($start、$interval、$end);
foreach(期间为$dt){
echo$dt->格式(“Y-m”)。“
\n”; }

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

您必须在同一年的两个月和不同年份的两个月之间进行区分

$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.'
}
$year\u 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();
试一试{
如果($year\u min>$year\u max)
抛出新异常();
否则如果($year\u min==$year\u max)
如果($month\u min>$month\u max)
抛出新异常();

对于($month=$month\u min;$month这是我的解决方案,因为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++;
}
$a=“2007-01-01”;
$b=“2008-02-15”;
$i=日期(“Ym”,标准时间($a));
而($i
函数getMonthsInRange($startDate,$endDate){
$months=array();
而(strotime($startDate)日期('Y',strotime($startDate)),'month'=>日期('m',strotime($startDate)),);
$startDate=日期('01 MY',标准时间($startDate。
“+1个月”);//将日期设置为1,以便在月份更改时返回新月份。
}
返回$months;
}
在Laravel

$period = \Carbon\CarbonPeriod::create('2017-06-28', '1 month', '2019-06-01');

foreach ($period as $dt) {
     echo $dt->format("Y-m") . "<br>\n";
}
$period=\Carbon\CarbonPeriod::create('2017-06-28','1个月','2019-06-01');
foreach(期间为$dt){
echo$dt->格式(“Y-m”)。“
\n”; }
IMO
this.is(“awesome!”)
。这就解决了问题,值得一试,只要看到有人使用datetime对象和DateInterval实现简单的解决方案……尽管我不希望你的销售代表做得更少:)我喜欢修改过的部分。太干净了。这绝对是答案。PHP5.4或更高版本中没有错误吗?在5.4以下的版本中有
$end->modify('first day of next month');
而5.4以上的版本是
->modify('first day of the month')
@Martin只是将结果放入数组中,然后将其反转。我不得不投票给你,感谢你花时间使用他们提供的代码来制定解决方案。非常感谢,我做得很开心。幸运的是,你没有在代码中选择我的答案:-P!你能澄清为什么这很有用吗?这一个在第一次尝试时非常有效。我喜欢这个解决方案来吧,完美满足我的需要。泰
$period = \Carbon\CarbonPeriod::create('2017-06-28', '1 month', '2019-06-01');

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