PHP获取一段时间内的每个周几, 每月几号, 遇到特殊日子就往后延
作者:Alpha时间:2020-10-15 阅读数:3044 +人阅读
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; }
本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:595397166@qq.com