位置:首页 > PHP > PHP功能函数 > 时间处理函数 >

PHP获取一段时间内的每个周几, 每月几号, 遇到特殊日子就往后延

字号+ 作者:micloud 来源:www.seoalphas.com 2020-10-15 08:54 浏览量:2174

2016年11月1日 16:18:19 星期二

主要用到的函数是 strtotime()

strtotime('+1 Tuesday', $timestamp) 获取下周二, 从时间戳$timestamp开始计算, 如果$timestamp留空, 则从当天开始计算

strtotime('+1 month', $timestamp) 获取下个月的x号, 还是以$timestamp开始计算的

/**
      * desc 获取每周X执行的所有日期
      * @param string $start 开始日期, 2016-10-17
      * @param string $end 结束日期, 2016-10-17
      * @param int $weekDay 1~5
      * @return array
      */
     public function getWeeklyBuyDate($start, $end, $weekDay)
     {
         //获取每周要执行的日期 例如: 2016-01-02
         $start = empty($start) ? date('Y-m-d') : $start;
         $startTime = strtotime($start);
 
         $startDay = date('N', $startTime);
         if ($startDay < $weekDay) {
             $startTime = strtotime(self::$WORK_DAY[$weekDay]['en'], strtotime($start)); //本周x开始, 例如, 今天(周二)用户设置每周四执行, 那本周四就会开始执行
         } else {
             $startTime = strtotime('next '.self::$WORK_DAY[$weekDay]['en'], strtotime($start));//下一个周x开始, 今天(周二)用户设置每周一执行, 那应该是下周一开始执行
         }
 
         $endTime = strtotime($end);
         $list = [];
         for ($i=0;;$i++) {
             $dayOfWeek = strtotime("+{$i} week", $startTime); //每周x
             if ($dayOfWeek > $endTime) {
                 break;
             }
             $list[] = date('Y-m-d', $dayOfWeek);
         }
 
         return $this->getExedate($start, $end, $list);
     }
 
     /**
      * desc 获取每月X号执行的所有日期
      * @param string $start 开始日期, 2016-10-17
      * @param string $end 结束日期, 2016-10-17
      * @param int $monthDay 1~28
      * @return array
      */
     public function getMonthlyBuyDate($start, $end, $monthDay)
     {
         $monthDay = str_pad($monthDay, 2, '0', STR_PAD_LEFT); //左边补零
         $start = empty($start) ? date('Y-m-d') : $start;
         $startTime = strtotime($start);
         $startDay = substr($start, 8, 2);
 
         if (strcmp($startDay, $monthDay) < 0) {
             $startMonthDayTime = strtotime(date('Y-m-', strtotime($start)).$monthDay); //本月开始执行, 今天(例如,26号)用户设置每月28号执行, 那么本月就开始执行
         } else  {
             $startMonthDayTime = strtotime(date('Y-m-', strtotime('+1 month', $startTime)).$monthDay); //从下个月开始
         }
         $endTime = strtotime($end);
 
         $list = [];
         for ($i=0;;$i++) {
             $dayOfMonth = strtotime("+{$i} month", $startMonthDayTime);//每月x号
             if ($dayOfMonth > $endTime) {
                 break;
             }
             $list[] = date('Y-m-d', $dayOfMonth);
         }
         
         return $this->getExedate($start, $end, $list);
 
     }
 
     /**
      * desc 返回顺延后的执行日期列表
      * @param string $start 开始日期, 2016-10-17
      * @param string $end 结束日期, 2016-10-17
      * @param array $planDate
      * @return array
      */
     public function getExedate($start, $end, $planDate)
     {
         //获取所有交易日
         $allTradeDate = $this->getTradeDate($start, $end);
 
         //取最后一个交易日
         $endTradeDate = end($allTradeDate); //返回格式: ['2016-11-01' => '2016-11-01', '2016-11-02' => '2016-11-02', ...], 有冗余,方便编程
 
         $exeDate = []; //顺延后的执行日期
         foreach ($planDate as $date) {
             if (!empty($allTradeDate[$date])) {
                 $exeDate[$date] = $date;
             } else { //没找到, 需要往后顺延到下一个交易日
                 $exeDate[$date] = '';
 
                 $endTradeTime = strtotime($endTradeDate);
                 $currentTime = strtotime($date);
 
                 for ($i=$currentTime; $i<=$endTradeTime; $i+=86400) {//一天一天往后顺延, 直到找到下一个交易日, 直到数据库存储的最后一个交易日
                     $tmpDate = date('Y-m-d', $i);
                     if (!empty($allTradeDate[$tmpDate])) { //找到就退出循环
                         $exeDate[$date] = $tmpDate;
                         break;
                     }
                 }
             }
         }
 
         return $exeDate;
     }


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • php中的时间戳与javascript中的时间戳的比较

    php中的时间戳与javascript中的时间戳的比较

    浏览次数:3982

  • php根据出生日期计算年龄函数

    php根据出生日期计算年龄函数

    浏览次数:3071

  • PHP时间日期操作增减(date strtotime) 加一天 加一月

    PHP时间日期操作增减(date strtotime) 加一天 加一月

    浏览次数:3000

  • PHP设置时区函数:date_default_timezone_set()

    PHP设置时区函数:date_default_timezone_set()

    浏览次数:2943

网友点评
评论区域