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 定位技术
|
2月前
|
安全 关系型数据库 MySQL
PHP与MySQL交互:从入门到实践
【9月更文挑战第20天】在数字时代的浪潮中,掌握PHP与MySQL的互动成为了开发动态网站和应用程序的关键。本文将通过简明的语言和实例,引导你理解PHP如何与MySQL数据库进行对话,开启你的编程之旅。我们将从连接数据库开始,逐步深入到执行查询、处理结果,以及应对常见的挑战。无论你是初学者还是希望提升技能的开发者,这篇文章都将为你提供实用的知识和技巧。让我们一起探索PHP与MySQL交互的世界,解锁数据的力量!
|
Unix .NET PHP
php取得当前时间函数
php取得当前时间函数文章提供了php的几种获取当前时间的函数,date,time等哦,同时告诉我如何解决时区问题哦。     php获取当前时间   使用函式 date() 实现   //2010-08-29 21:25:26 //Y是4位的年,H是24小时制 --------------------------------------------------------------------------     php教程取得当前时间函数文章提供了php的几种获取当前时间的函数,date,time等哦,同时告诉我如何解决时区问题哦。
1220 0
|
2月前
|
NoSQL 关系型数据库 MySQL
不是 PHP 不行了,而是 MySQL 数据库扛不住啊
【9月更文挑战第8天】这段内容讨论了MySQL在某些场景下面临的挑战及其原因,并指出这些问题不能完全归咎于MySQL本身。高并发读写压力、数据量增长以及复杂查询和事务处理都可能导致性能瓶颈。然而,应用程序设计不合理、系统架构不佳以及其他数据库选择和优化策略不足也是重要因素。综合考虑这些方面才能有效解决性能问题,而MySQL通过不断改进和优化,仍然是许多应用场景中的可靠选择。
124 9
|
3月前
|
存储 SQL 关系型数据库
PHP与MySQL交互的奥秘
【8月更文挑战第29天】在编程的世界里,PHP和MySQL就像是一对默契的舞伴,共同演绎着数据的交响曲。本文将带你探索它们之间的互动,从连接数据库到执行查询,再到处理结果,每一步都充满了节奏与和谐。我们将一起走进这段代码的旅程,感受数据流动的魅力。
|
3天前
|
存储 关系型数据库 MySQL
PHP与MySQL动态网站开发深度解析####
本文作为技术性文章,深入探讨了PHP与MySQL结合在动态网站开发中的应用实践,从环境搭建到具体案例实现,旨在为开发者提供一套详尽的实战指南。不同于常规摘要仅概述内容,本文将以“手把手”的教学方式,引导读者逐步构建一个功能完备的动态网站,涵盖前端用户界面设计、后端逻辑处理及数据库高效管理等关键环节,确保读者能够全面掌握PHP与MySQL在动态网站开发中的精髓。 ####
|
4天前
|
关系型数据库 MySQL PHP
PHP与MySQL动态网站开发实战指南####
本文深入探讨了PHP与MySQL在动态网站开发中的应用实践,通过具体案例解析如何高效结合这两大技术构建数据驱动的Web应用。文章将涵盖环境搭建、基础语法回顾、数据库设计与操作、用户注册与登录系统实现等关键步骤,旨在为开发者提供一个从零到一的项目实战路径,展示PHP与MySQL协同工作的强大能力。 ####
|
23天前
|
SQL 关系型数据库 MySQL
PHP与MySQL协同工作的艺术:开发高效动态网站
在这个后端技术迅速迭代的时代,PHP和MySQL的组合仍然是创建动态网站和应用的主流选择之一。本文将带领读者深入理解PHP后端逻辑与MySQL数据库之间的协同工作方式,包括数据的检索、插入、更新和删除操作。文章将通过一系列实用的示例和最佳实践,揭示如何充分利用这两种技术的优势,构建高效、安全且易于维护的动态网站。
|
3月前
|
SQL 关系型数据库 MySQL
PHP与MySQL交互之基础教程
【8月更文挑战第31天】 在数字世界中,数据是推动一切的核心力量。本文将引导你探索PHP与MySQL的协同工作,通过实际代码示例,展示如何建立连接、执行查询以及处理结果集。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你提供宝贵的实践知识。
|
4月前
|
数据库
基于PHP+MYSQL开发制作的趣味测试网站源码
基于PHP+MYSQL开发制作的趣味测试网站源码。可在后台提前设置好缘分, 自己手动在数据库里修改数据,数据库里有就会优先查询数据库的信息, 没设置的话第一次查询缘分都是非常好的 95-99,第二次查就比较差 , 所以如果要你女朋友查询你的名字觉得很好 那就得是她第一反应是查和你的缘分, 如果查的是别人,那不好意思,第二个可能是你。
66 3