计算两个日期之间的(年)季度

时间:2017-11-14 15:45:29

标签: php laravel

我使用laravel构建了项目,我必须构建一个函数来计算所选日期范围内的所有完整区域 - 使用的日期通过输入插入。

以下是季度(我使用了几个月的数字表示法)

01 - 03第一季度 04 - 06第二季度 07年9月7日 10-12 12季度

我真的很感谢你的帮助,因为我已经在这一整天了,并且基本上没有什么可以表现出来的,我的事情我一直在努力,我实际上是在我的地步我好累,我不能直接思考。

我确实有一些代码但它没有价值,因为它不起作用,欢迎使用任何类型的代码或代码片段。

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

我设法使用多个功能;基本上,如果图表统计需要这个,那么可能就是一种更具体的方法。 我已经在Laravel中完成了这个时间戳日期作为输入(此代码也适用于学期也可以:),它可以工作并且已经过测试了):

    public static function getQuartersBetween($start_ts, $end_ts)
{
    $quarters = [];
    $months_per_year = [];
    $years = self::getYearsBetween($start_ts, $end_ts);
    $months = self::getMonthsBetween($start_ts, $end_ts);

    foreach ($years as $year) {
        foreach ($months as $month) {
            if ($year->format('Y') == $month->format('Y')) {
                $months_per_year[$year->format('Y')][] = $month;
            }
        }
    }

    foreach ($months_per_year as $year => $months) {
        $january = new Date('01-01-' . $year);
        $march = new Date('01-03-' . $year);
        $april = new Date('01-04-' . $year);
        $june = new Date('01-06-' . $year);
        $july = new Date('01-07-' . $year);
        $september = new Date('01-09-' . $year);
        $october = new Date('01-10-' . $year);
        $december = new Date('01-12-' . $year);

        if (in_array($january, $months) && in_array($march, $months)) {
            $quarter_per_year['label'] = 'T1 / ' . $year;
            $quarter_per_year['start_day'] = $january->startOfMonth();
            $quarter_per_year['end_day'] = $march->endOfMonth()->endOfDay();
            array_push($quarters, $quarter_per_year);
        }

        if (in_array($april, $months) && in_array($june, $months)) {
            $quarter_per_year['label'] = 'T2 / ' . $year;
            $quarter_per_year['start_day'] = $april->startOfMonth();
            $quarter_per_year['end_day'] = $june->endOfMonth()->endOfDay();
            array_push($quarters, $quarter_per_year);
        }

        if (in_array($july, $months) && in_array($september, $months)) {
            $quarter_per_year['label'] = 'T3 / ' . $year;
            $quarter_per_year['start_day'] = $july->startOfMonth();
            $quarter_per_year['end_day'] = $september->endOfMonth()->endOfDay();
            array_push($quarters, $quarter_per_year);
        }

        if (in_array($october, $months) && in_array($december, $months)) {
            $quarter_per_year['label'] = 'T4 / ' . $year;
            $quarter_per_year['start_day'] = $october->startOfMonth();
            $quarter_per_year['end_day'] = $december->endOfMonth()->endOfDay();
            array_push($quarters, $quarter_per_year);
        }
    }

    return $quarters;
}

以及之间的年份:

    public static function getYearsBetween($start_ts, $end_ts, $full_period = false)
{
    $return_data = [];
    $current = mktime(0, 0, 0, date('m', $start_ts), date('d', $start_ts), date('Y', $start_ts));

    while ($current < $end_ts) {
        $temp_date = $current;
        $year = new Date($temp_date);
        $return_data[] = $year;
        $current = strtotime("+1 year", $current); // add a year
    }

    if ($full_period) {
        $return_data[] = $end_ts;
    }

    return $return_data;
}

,也需要几个月的时间

    public static function getMonthsBetween($start_ts, $end_ts, $full_period = false)
{
    $return_data = $month_list = [];
    $current = mktime(0, 0, 0, date('m', $start_ts), date('d', $start_ts), date('Y', $start_ts));

    while ($current <= $end_ts) {
        $temp_date = $current;
        $date = new Date($temp_date);
        $month_list[] = $date;

        $current = strtotime("+1 month", $current); // add a month
    }

    $start_date_last_month = new Date(array_first($month_list));
    $start_date_last_month = $start_date_last_month->startOfMonth()->format('m-d');
    $temp_end_date = new Date($start_ts);
    $temp_end_date = $temp_end_date->format('m-d');

    if ($start_date_last_month < $temp_end_date) {
        array_shift($month_list);
    }

    $end_date_last_month = new Date(end($month_list));
    $current_day_month = $end_date_last_month->endOfMonth()->format('m-d');
    $temp_end_date = new Date($end_ts);
    $end_day_of_month = $temp_end_date->format('m-d');

    if ($end_day_of_month < $current_day_month) {
        array_pop($month_list);
    }

    if (count($month_list) == 0) {
        $month_list[] = $end_date_last_month->subMonth();
    }

    $return_data = $month_list;
    if ($full_period) {
        $return_data[] = $end_ts;
    }

    return $return_data;
}

答案 1 :(得分:0)

你可以在这个例子中做一些事情:

$February = 2;
$October = 10;

$completedQuarters = ceil($October/3) - ceil($February/3); // = 3

日期范围开始的季度怎么样呢?如果它只计算在一个季度的第一个月开始,你可以这样检查它:

$completedQuarters = ceil($October/3) - ceil($February/3) -1; // = 2
if($February-1%3 == 0) $completedQuarters += 1;  

你的描述不是很清楚,请告诉我你的想法是否正确。

答案 2 :(得分:0)

不确定以下是否是您的意思但可能有用

$date_start='2015/03/12';
$date_end='2017/11/14';

$timezone=new DateTimeZone('Europe/London');
$start=new DateTime( $date_start, $timezone );
$end=new DateTime( $date_end, $timezone );


$difference = $end->diff( $start );
$months = ( ( $difference->format('%y') * 12 ) + $difference->format('%m') );
$quarters = intval( $months / 3 );

printf( 'Quarters between %s and %s is %d covering %d months', $start->format('l, jS F Y'), $end->format('l, jS F Y'), $quarters, $months );

/*
   This will output
   ----------------

   Quarters between Thursday, 12th March 2015 and Tuesday, 14th November 2017 is 10 covering 32 months
*/

答案 3 :(得分:0)

在函数中有这样的东西你应该设置。

use Carbon\Carbon;

$first = Carbon::parse('2012-1-1'); //first param
$second = Carbon::parse('2014-9-15'); //second param

$fY = $first->year; //2012 
$fQ = $first->quarter; //1

$sY = $second->year; //2014
$sQ = $second->quarter; //3

$n = 0; //the number of quarters we have counted
$i = 0; //an iterator we will use to determine if we are in the first year

for ($y=$fY; $y < $sY; $y++, $i++) { //for each year less than the second year (if any)
    $s = ($i > 0) ? 1 : $fQ; //determine the starting quarter
    for ($q=$s; $q <= 4; $q++) { //for each quarter
        $n++; //count it
    }
}

if ($sY > $fY) { //if both dates are not in the same year
    $n = $n + $sQ; //total is the number of quarters we've counted plus the second quarter value
} else {
    for ($q=$fQ; $q <= $sQ; $q++) { //for each quarter between the first quarter and second
        $n++; //count it
    }
}

print $n; //the value to return (11)