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

简介: 2016年11月1日 16:18:19 星期二 主要用到的函数是 strtotime() strtotime('+1 Tuesday', $timestamp) 获取下周二, 从时间戳$timestamp开始计算, 如果$timestamp留空, 则从当天开始计算 strtotime('+1 ...

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

主要用到的函数是 strtotime()

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

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

  1 /**
  2      * desc 获取每周X执行的所有日期
  3      * @param string $start 开始日期, 2016-10-17
  4      * @param string $end 结束日期, 2016-10-17
  5      * @param int $weekDay 1~5
  6      * @return array
  7      */
  8     public function getWeeklyBuyDate($start, $end, $weekDay)
  9     {
 10         //获取每周要执行的日期 例如: 2016-01-02
 11         $start = empty($start) ? date('Y-m-d') : $start;
 12         $startTime = strtotime($start);
 13 
 14         $startDay = date('N', $startTime);
 15         if ($startDay < $weekDay) {
 16             $startTime = strtotime(self::$WORK_DAY[$weekDay]['en'], strtotime($start)); //本周x开始, 例如, 今天(周二)用户设置每周四执行, 那本周四就会开始执行
 17         } else {
 18             $startTime = strtotime('next '.self::$WORK_DAY[$weekDay]['en'], strtotime($start));//下一个周x开始, 今天(周二)用户设置每周一执行, 那应该是下周一开始执行
 19         }
 20 
 21         $endTime = strtotime($end);
 22         $list = [];
 23         for ($i=0;;$i++) {
 24             $dayOfWeek = strtotime("+{$i} week", $startTime); //每周x
 25             if ($dayOfWeek > $endTime) {
 26                 break;
 27             }
 28             $list[] = date('Y-m-d', $dayOfWeek);
 29         }
 30 
 31         return $this->getExedate($start, $end, $list);
 32     }
 33 
 34     /**
 35      * desc 获取每月X号执行的所有日期
 36      * @param string $start 开始日期, 2016-10-17
 37      * @param string $end 结束日期, 2016-10-17
 38      * @param int $monthDay 1~28
 39      * @return array
 40      */
 41     public function getMonthlyBuyDate($start, $end, $monthDay)
 42     {
 43         $monthDay = str_pad($monthDay, 2, '0', STR_PAD_LEFT); //左边补零
 44         $start = empty($start) ? date('Y-m-d') : $start;
 45         $startTime = strtotime($start);
 46         $startDay = substr($start, 8, 2);
 47 
 48         if (strcmp($startDay, $monthDay) < 0) {
 49             $startMonthDayTime = strtotime(date('Y-m-', strtotime($start)).$monthDay); //本月开始执行, 今天(例如,26号)用户设置每月28号执行, 那么本月就开始执行
 50         } else  {
 51             $startMonthDayTime = strtotime(date('Y-m-', strtotime('+1 month', $startTime)).$monthDay); //从下个月开始
 52         }
 53         $endTime = strtotime($end);
 54 
 55         $list = [];
 56         for ($i=0;;$i++) {
 57             $dayOfMonth = strtotime("+{$i} month", $startMonthDayTime);//每月x号
 58             if ($dayOfMonth > $endTime) {
 59                 break;
 60             }
 61             $list[] = date('Y-m-d', $dayOfMonth);
 62         }
 63         
 64         return $this->getExedate($start, $end, $list);
 65 
 66     }
 67 
 68     /**
 69      * desc 返回顺延后的执行日期列表
 70      * @param string $start 开始日期, 2016-10-17
 71      * @param string $end 结束日期, 2016-10-17
 72      * @param array $planDate
 73      * @return array
 74      */
 75     public function getExedate($start, $end, $planDate)
 76     {
 77         //获取所有交易日
 78         $allTradeDate = $this->getTradeDate($start, $end);
 79 
 80         //取最后一个交易日
 81         $endTradeDate = end($allTradeDate); //返回格式: ['2016-11-01' => '2016-11-01', '2016-11-02' => '2016-11-02', ...], 有冗余,方便编程
 82 
 83         $exeDate = []; //顺延后的执行日期
 84         foreach ($planDate as $date) {
 85             if (!empty($allTradeDate[$date])) {
 86                 $exeDate[$date] = $date;
 87             } else { //没找到, 需要往后顺延到下一个交易日
 88                 $exeDate[$date] = '';
 89 
 90                 $endTradeTime = strtotime($endTradeDate);
 91                 $currentTime = strtotime($date);
 92 
 93                 for ($i=$currentTime; $i<=$endTradeTime; $i+=86400) {//一天一天往后顺延, 直到找到下一个交易日, 直到数据库存储的最后一个交易日
 94                     $tmpDate = date('Y-m-d', $i);
 95                     if (!empty($allTradeDate[$tmpDate])) { //找到就退出循环
 96                         $exeDate[$date] = $tmpDate;
 97                         break;
 98                     }
 99                 }
100             }
101         }
102 
103         return $exeDate;
104     }

 

其中:

1 public static $WORK_DAY = [
2         1 => ['en' => 'Monday', 'cn' => '一'],
3         2 => ['en' => 'Tuesday', 'cn' => '二'],
4         3 => ['en' => 'Wednesday', 'cn' => '三'],
5         4 => ['en' => 'Thursday', 'cn' => '四'],
6         5 => ['en' => 'Friday', 'cn' => '五']
7     ];

 

目录
相关文章
|
PHP 定位技术
|
Unix .NET PHP
php取得当前时间函数
php取得当前时间函数文章提供了php的几种获取当前时间的函数,date,time等哦,同时告诉我如何解决时区问题哦。     php获取当前时间   使用函式 date() 实现   //2010-08-29 21:25:26 //Y是4位的年,H是24小时制 --------------------------------------------------------------------------     php教程取得当前时间函数文章提供了php的几种获取当前时间的函数,date,time等哦,同时告诉我如何解决时区问题哦。
1278 0
|
2月前
|
关系型数据库 MySQL Linux
查看Linux、Apache、MySQL、PHP版本的技巧
以上就是查看Linux、Apache、MySQL、PHP版本信息的方法。希望这些信息能帮助你更好地理解和使用你的LAMP技术栈。
128 17
|
3月前
|
关系型数据库 MySQL PHP
源码编译安装LAMP(HTTP服务,MYSQL ,PHP,以及bbs论坛)
通过以上步骤,你可以成功地在一台Linux服务器上从源码编译并安装LAMP环境,并配置一个BBS论坛(Discuz!)。这些步骤涵盖了从安装依赖、下载源代码、配置编译到安装完成的所有细节。每个命令的解释确保了过程的透明度,使即使是非专业人士也能够理解整个流程。
73 18
|
7月前
|
前端开发 关系型数据库 MySQL
PHP与MySQL动态网站开发实战指南####
【10月更文挑战第21天】 本文将深入浅出地探讨如何使用PHP与MySQL构建一个动态网站,从环境搭建到项目部署,全程实战演示。无论你是编程新手还是希望巩固Web开发技能的老手,都能在这篇文章中找到实用的技巧和启发。我们将一起探索如何通过PHP处理用户请求,利用MySQL存储数据,并最终呈现动态内容给用户,打造属于自己的在线平台。 ####
262 0
|
4月前
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
237 25
|
7月前
|
安全 关系型数据库 MySQL
PHP与MySQL动态网站开发实战指南####
——深入探索LAMP栈下的高效数据交互与处理技巧 ####
|
6月前
|
存储 关系型数据库 MySQL
PHP与MySQL动态网站开发:从基础到实践####
本文将深入探讨PHP与MySQL的结合使用,展示如何构建一个动态网站。通过一系列实例和代码片段,我们将逐步了解数据库连接、数据操作、用户输入处理及安全防护等关键技术点。无论您是初学者还是有经验的开发者,都能从中获益匪浅。 ####
|
7月前
|
关系型数据库 MySQL PHP
PHP与MySQL动态网站开发实战指南####
深入探索PHP与MySQL的协同工作机制,本文旨在通过一系列实战案例,揭示构建高效、稳定且用户友好的动态网站的秘诀。从环境搭建到数据交互,再到最佳实践分享,本文为开发者提供了一条清晰的学习路径,助力其在LAMP(Linux, Apache, MySQL, PHP/Perl/Python)栈上实现技术飞跃。 ####
|
6月前
|
关系型数据库 MySQL PHP
php实现一个简单的MySQL分页
通过本文的详细步骤和代码示例,我们实现了一个简单的PHP MySQL分页功能。主要步骤包括计算总记录数、设置分页参数、查询当前页的数据以及生成分页链接。这种分页方式适用于大多数Web应用,能够有效提升用户体验和页面响应速度。
203 4