首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算两个日期之间的(年份)季度数

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

Stack Overflow用户
提问于 2017-11-14 23:45:29
回答 4查看 1.6K关注 0票数 0

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

这里是季度(我使用了月份的数字表示)

01 - 03第一季04 - 06第二季07 - 09第三季10 - 12第四季

我真的很感谢你的帮助,因为我已经做了一整天了,基本上没有什么可以表现出来的,我想我已经努力了,实际上我已经到了疲倦的地步,我不能思考了。

我确实有一些代码,但它没有价值,因为它不能工作,任何类型的想法或代码片段都是受欢迎的。

提前感谢您的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-11-24 17:04:34

我使用多个函数设法做到了这一点;基本上,如果图表统计需要这样做,那么可能需要一种更具体的方法。我已经在Laravel中用时间戳日期作为输入(这段代码也可以用来获取学期:),它可以工作,并且已经测试过了):

代码语言:javascript
复制
    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;
}

以及在这两年之间的时间:

代码语言:javascript
复制
    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;
}

,还可以获得所需的月份

代码语言:javascript
复制
    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
EN

Stack Overflow用户

发布于 2017-11-14 23:58:31

您可以执行以下示例中的操作:

代码语言:javascript
复制
$February = 2;
$October = 10;

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

那么日期范围开始的那个季度呢,它也应该被计算在内吗?如果它只计入在一个季度的第一个月开始,你可以像这样检查它:

代码语言:javascript
复制
$completedQuarters = ceil($October/3) - ceil($February/3) -1; // = 2
if($February-1%3 == 0) $completedQuarters += 1;  

你的描述不是很清楚,如果这是你想要的,请告诉我。

票数 0
EN

Stack Overflow用户

发布于 2017-11-15 01:18:19

我不确定下面是不是你想说的,但可能有用

代码语言:javascript
复制
$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
*/
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47289831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档