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获取一段时间内的每个周几, 每月几号, 遇到特殊日子就往后延相关推荐

  1. java 周几_java根据日期获取周几和获取某段时间内周几的日期

    整理两个日期的方法. 根据日期获取当天是周几 /** * 根据日期获取当天是周几 * @param datetime 日期 * @return 周几 */ public static String d ...

  2. oracle获取一段时间内所有的小时、天、月

    原文链接:http://blog.csdn.net/ld422586546/article/details/9626921/ 点击阅读原文 ------------------------------ ...

  3. 原生js获取一段时间内每隔几分钟的时间数组

    姊妹篇 原生js获取一段时间内每隔几天的时间数组 情况: 项目中有这么一个需求,输入开始时间.结束时间.时间间隔,获取一段时间内每隔几分钟的时间数组 接下来我必须现在网上找找有没有类似的稍微改改就好了 ...

  4. Jquery获取一段时间内所有对应的日期,并获取日期对应的星期几。

    本文是将已知的一段时间(已知开始时间,结束时间),获取这一段时间内所有的日期,包含开始时间,结束时间,并对应星期几. 1,获取一段时间的字符串,返回的是字符串,调用时在后面加, /*** 获取日期段所 ...

  5. php获取一段时间内的法定工作日

    首先,需要自己在后台创建一个表 content_cooper 这个结构如下: CREATE TABLE `my_content_cooper` (`id` int(11) unsigned NOT N ...

  6. java 时间段内月份_java获取某段时间内的月份列表

    /**获取两个时间节点之间的月份列表**/ private static List getMonthBetween(String minDate, String maxDate){ ArrayList ...

  7. 缺失值处理 - 获取一段时间内所有日期的列表 - (Python、MySQL)

    有的时候做数据清洗的时候 , 如果表中数据在某一天没有记录,但是业务要求不能有缺失日期,那么就需要我们将这些缺失日期补上.这个前提就是我们先要有一张包含所有日期的列表(作为左表),供我们进行匹配(le ...

  8. js获取一段时间内工作日的天数

    代码 function workday_count(start, end) {let count = 0;let current = start;while (current< end) {co ...

  9. java获取一段时间内的所有时间

    ArrayList<LocalDateTime> dateTimes = new ArrayList<>();for(int i = 0; i < 6; i++) {Lo ...

最新文章

  1. NoClassDefFoundError: org/mybatis/logging/LoggerFactory
  2. 【算法竞赛学习】学术前沿趋势-作者信息关联
  3. 【大牛系列教学】java面试常考的编程题
  4. leetcode —— 965. 单值二叉树
  5. php _call call_user_func_array,PHP call_user_func和call_user_func_array函数的简单理解与应用分析...
  6. 饿了么UI库--Vue开发必备神器--让你轻松设计出好看的页面
  7. MTK平台Camera图片的Exif信息
  8. C++洛谷题解(17)——P5713
  9. 网站检测-网站检测软件-免费网站安全检测工具
  10. JS/ES6-var、let、const用法与区别
  11. 屠龙少年终成恶龙!Adobe豪掷200亿美元收购Figma,设计圈炸了!
  12. 图的度序列:Havel定理
  13. 查看ubuntu系统的版本详细信息
  14. python中列表(list)的基本定义和用法
  15. 18级的谷歌卫星地图纹理如何匹配到15级的高程
  16. kali渗透之DC-2
  17. 回望2019:江城芜湖的“科技智变”
  18. 实体类多层嵌套 遍历_多层嵌套的json数据
  19. python爬虫(二十四)爬取汽车之家某品牌图片
  20. 知更鸟菜单导航如何添加自定义个性图标?

热门文章

  1. java 多线程callable_java 多线程-实现Callable接口
  2. ip查看是否在线_linux查看端口占用情况
  3. redis的bitmap操作
  4. php sesssion,php sesssion原理
  5. 单片机汇编语言编程_单片机编程用C语言还是汇编?
  6. html 自动完成,如何指定 form或 input元素是否应在HTML中启用自动完成功能?
  7. mysql记录当前表数据的数据条数据类型_MySQL学习记录:数据类型与操作数据表...
  8. python百度知道_用Python写的一个【百度知道】自动点赞
  9. mysql group by 两列_MySQL GROUP BY两列
  10. 图解TCPIP-传输层 TCP