查找2个月之间的所有季度

时间:2015-09-04 13:24:40

标签: php

在印度标准中,宿舍以这种方式安排。

  • Q1 - 4月至6月
  • Q2 - 7月至9月
  • Q2 - 10月至12月
  • Q2 - 1月至3月

我的输入是 $StartDate='01-2014'; $EndDate='02-2015 其中01-2014从2014年第一季度开始告知,并且2015年第二季度结束于2015年第二季度结束。我需要编写一个函数,它将返回一个包含这两个日期之间所有季度的数组。我怎么做到这一点?该数组应如下所示。

  

$ qtrArr = [' 1-2014',' 2-2014',' 3-2014',' 4-2014' ,' 1-2015',' 2-2015'];

2 个答案:

答案 0 :(得分:4)

这是了解PHP的DateTime功能的好机会。

表达季度定义的一种方法是通过DatePeriod,它允许您迭代一段时间或一组定期重复出现的日期。所以你的用例就是一个完美的用例。这是一个例子......

function getQuarters($start, $end) {

    $StartDate = DateTime::createFromFormat('m-Y', $start);
    $EndDate   = DateTime::createFromFormat('m-Y', $end);
    $quarters  = new DatePeriod($StartDate, new DateInterval('P3M'), $EndDate);
    $p = 0;
    $r = [];
    foreach($quarters as $quarter) {
        if (!$p) {
            $q = [$quarter];
            $p++;
        } else {
            $q[] = $quarter;
            $p = 0;
            $r[] = $q;
        }
    }
    return $r;

}

var_dump(getQuarters('01-2014','02-2015'));

所以你得到这样的东西......

array(2) {
  [0]=>
  array(2) {
    [0]=>
    object(DateTime)#8 (3) {
      ["date"]=>
      string(26) "2014-01-04 09:45:46.000000"
      ["timezone_type"]=>
      int(3)
      ["timezone"]=>
      string(16) "America/New_York"
    }
    [1]=>
    object(DateTime)#9 (3) {
      ["date"]=>
      string(26) "2014-04-04 09:45:46.000000"
      ["timezone_type"]=>
      int(3)
      ["timezone"]=>
      string(16) "America/New_York"
    }
  }
  [1]=>
  array(2) {
    [0]=>
    object(DateTime)#10 (3) {
      ["date"]=>
      string(26) "2014-07-04 09:45:46.000000"
      ["timezone_type"]=>
      int(3)
      ["timezone"]=>
      string(16) "America/New_York"
    }
    [1]=>
    object(DateTime)#11 (3) {
      ["date"]=>
      string(26) "2014-10-04 09:45:46.000000"
      ["timezone_type"]=>
      int(3)
      ["timezone"]=>
      string(16) "America/New_York"
    }
  }
}

你基本上有一个数组数组。每个元素代表一个四分之一,每个子元素代表该季度的开始和结束日期。

另请注意,此特定示例并未总结您的确切要求,因为它是独占的,而不是将DatePeriod视为邻接列表,这更符合您的要求。所以请随意根据需要进行编辑。这只是我的头脑。

答案 1 :(得分:1)

如果您不想使用DateTime,可以选择此选项。

function getQuarters($start,$end){
    $start_q = (int) explode('-',$start)[0];
    $start_y = (int) explode('-',$start)[1];

    $end_q = (int) explode('-',$end)[0];
    $end_y = (int) explode('-',$end)[1];

    $r = ["$start_q-$start_y"];
    $next_q = $start_q;
    $next_y = $start_y;

    while($next_q != $end_q || $next_y != $end_y){
            $next_y = $next_q == 4 ? $next_y + 1 : $next_y;
        $next_q = $next_q == 4 ? 1 : $next_q + 1;

        $r[] = "$next_q-$next_y";
    }

    return $r;
}

的结果
$StartDate='01-2014'; 
$EndDate='02-2015';

print_r(getQuarters($StartDate,$EndDate));

Array ( [0] => 1-2014 [1] => 2-2014 [2] => 3-2014 [3] => 4-2014 [4] => 1-2015 [5] => 2-2015 )