获取一段时间内,以月/季度为单位,第N天在各个月/季度是几几年几月几号

这段代码提供了一个功能,用于在给定的时间范围内,按季度和月份获取第N天的具体日期。它计算了每个季度和月份的第一天,并根据输入的天数确定日期。此外,还包含了获取年份中每个月份天数的辅助方法。这些方法对于处理日期相关的数据分析和日历应用非常有用。
摘要由CSDN通过智能技术生成
    /**
     * 获取一段时间内(可跨年),以季度为单位,第N天在各个季度是几月几号
     * @param $sTime        时间戳
     * @param $eTime        时间戳
     * @param $number       第N天
     * @return array
     * @author fengzi
     * @date   2022-11-17 21:16
     */
    public function getQuarterDate($sTime, $eTime, $number) {
        $dates = [];
        $sDate = date('Y-m-d', $sTime);
        $eDate = date('Y-m-d', $eTime);
        for( $i = $sTime; $i <= $eTime; $i = strtotime('+3 month', $i) )
        {
            $tempNumber = $number;
            $monthNum   = date('n', $i);
            $yearNumber = date('Y', $i);
            //获取所在季度的第一个月份
            $startMonthNumber = (($this->getQuarterByMonth($monthNum) - 1) * 3) + 1;

            if ( isset($dayCountByYear[$yearNumber]) ) {
                $dayCountByMonth = $dayCountByYear[$yearNumber];
            } else {
                //获取当前年份的各个月份的天数
                $dayCountByMonth = $this->getMonthDays($yearNumber);
                $dayCountByYear[$yearNumber] = $dayCountByMonth;
            }

            for ($j=$startMonthNumber; $j<=($startMonthNumber+2); $j++) {
                $diff = bcsub($tempNumber, $dayCountByMonth[$j]);
                if ( $diff > 0 ) {
                    $tempNumber = $diff;
                } elseif ( $diff <= 0 ) {
                    $jMonth = str_pad($j, 2, '0', STR_PAD_LEFT);//补充前导零
                    $tempNumber = str_pad($tempNumber, 2, '0', STR_PAD_LEFT); //补充前导零
                    $tempDate = $yearNumber.'-'.$jMonth.'-'.$tempNumber;
                    if ( $sDate <= $tempDate && $tempDate <= $eDate ) {
                        $dates[$yearNumber][] = $tempDate;
                    }
                    break;
                }
            }
        }

        return $dates;
    }



    /**
     * 获取一段时间内(可跨年),以月为单位,第N天在各个月份是几月几号
     * @param $sTime        时间戳
     * @param $eTime        时间戳
     * @param $number       第N天
     * @return array
     * @author fengzi
     * @date   2022-11-18 18:41
     */
    public function getMonthDate($sTime, $eTime, $number)
    {
        $dates = [];

        for( $i = $sTime; $i <= $eTime; $i = strtotime('+1 month', $i) )
        {
            $yearNumber       = date('Y', $i);
            if ( isset($dayCountByYear[$yearNumber]) ) {
                $dayCountByMonth = $dayCountByYear[$yearNumber];
            } else {
                $dayCountByMonth = $this->getMonthDays($yearNumber);
                $dayCountByYear[$yearNumber] = $dayCountByMonth;
            }

            //获取当前时间的月份
            $monthNumber      = date('n', $i);
            $oneMonthTotalNum = $dayCountByMonth[$monthNumber];

            if ( $i == $sTime ) {
                //获取当前时间的天(几号)
                $sDay  = date('j', $sTime);
                if ( $number >= $sDay && $sDay <= $oneMonthTotalNum ) {
                    $dates[$yearNumber][] =  $yearNumber.'-'.$monthNumber.'-'.$number;
                }
            } elseif ( $i == $eTime ) {
                //获取当前时间的天(几号)
                $eDay  = date('j', $eTime);
                if ( $number <= $eDay && $eDay >=1 ) {
                    $dates[$yearNumber][] =  $yearNumber.'-'.$monthNumber.'-'.$number;
                }
            } else {
                if ( 1 <= $number && $number <=$oneMonthTotalNum ) {
                    $dates[$yearNumber][] = date('Y-m-'.$number, $i);
                }
            }
        }

        return $dates;
    }



  /**
     * 获取某年的各个月份分别有几天
     * @param $year     年份,如:2022
     * @return array   输入年份的每个月的天数
     * @author fengzi
     * @date   2022-11-18 18:38
     */
    public function getMonthDays($year)
    {
        $dayCountByMonth = [];

        for ($i=1; $i<=12; $i++) {
            $dayCountByMonth[$i] = date("t", strtotime($year . "-" . $i . "-01"));
        }

        return $dayCountByMonth;
    }



   /**
     * 获取月份所在季度的第一个月份
     * @param $monthNumber
     * @return int
     * @author fengzi
     * @date   2022-11-17 20:57
     */
    public function getQuarterByMonth($monthNumber) {
        return floor(($monthNumber - 1) / 3) + 1;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值