Nice programing

두 날짜 사이의 모든 달을 나열하는 방법

nicepro 2020. 12. 31. 23:27
반응형

두 날짜 사이의 모든 달을 나열하는 방법


두 날짜 사이의 모든 달을 나열하려고합니다.

예를 들면 다음과 같습니다. 시작일 : 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;
        }
    }

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";
}

실제 모습보기

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";
}

시작일과 종료일을 매월 1 일로 수정하는 부분이 중요합니다. 그렇지 않고 현재 날짜가 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.'
}

그것은 어려운 길입니다. 이제 내가 선택하도록 권장하는 답변으로 이미 주어진 빠르고 쉬운 방법이 있습니다.


    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('d M Y', strtotime($startDate.
        '+ 1 month'));
}

return $months;
}

내 서버 환경에서 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

ReferenceURL : https://stackoverflow.com/questions/18742998/how-to-list-all-months-between-two-dates

반응형