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;
}

其中:

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

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

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

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

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

    获取一段时间内所有的小时 ) sdate FROM dual CONNECT ; 获取一段时间内所有的天 sdate FROM dual CONNECT ; from user_objects whe ...

  3. Java 获取一段时间内的每一天

    有时候我们会遇到一些业务场景,需要去获取一段时间内的每一天日期 public static List<Date> findDates(Date dBegin, Date dEnd) { L ...

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

    /**获取两个时间节点之间的月份列表**/ private static List<String> getMonthBetween(String minDate, String maxDa ...

  5. JS 获取一段时间内的工作时长小时数

    本来想是想找轮子的,但是并没有找到能用的,多数都是问题很大,所以就自己写了一个 需求说明 支持自选时间段,即开始时间与结束时间根据用户的上班及下班时间判定返回小时数 技术栈 moment.js 思考过 ...

  6. 用sql获取一段时间内的数据

    我把我CSDN写的   搬来博客园了.. SELECT * FROM 表名 WHERE timestampdiff(MINUTE, SYSDATE(), send_time) <=60 AND ...

  7. mysql 获取一段时间的数据

    用 sql 获取一段时间内的数据: SELECT * FROM EDI.edi_history WHERE timestampdiff(day, SYSDATE(), create_time_loc) ...

  8. 利用zabbix API 统计一段时间内监控项的均值和峰值

    #coding:utf-8 #给定主机IP获取一段时间内cpu的均值和峰值并写入文件(txt,可以跑完后直接把后缀名改为csv以表格形式打开):需要指定IP文件 import requests imp ...

  9. Java得到的一周的最后一天的一段时间内

    Java得到的一周的最后一天的一段时间内 1.设计源代码 LastDayOfWeek.java: /** * @Title:LastDayOfWeek.java * @Package:com.you. ...

随机推荐

  1. echarts在.Net中使用实例(二) 使用ajax动态加载数据

    通过上一篇文章可以知道和echarts参考手册可知,series字段就是用来存储我们显示的数据,所以我们只需要用ajax来获取series的值就可以. option 名称 描述 {color}back ...

  2. css的命名规则

    本文转载自谈笑涧<css的命名规则> 操作系统版本:Windows 7 浏览器版本:IE6,IE7,IE8,Firefox 3.6.2,Safari 4.0.4,Chrome 5.0.35 ...

  3. 解决某些Android Permission denied

    最近遇到一个问题,总是在模拟器重报Permission denied错误,于是我直接在手机上测试,发现没有错误,于是很郁闷,反复在AndroidManifest中加入权限   <uses-per ...

  4. UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

    UML类图关系(泛化 .继承.实现.依赖.关联.聚合.组合) 继承.实现.依赖.关联.聚合.组合的联系与区别 分别介绍这几种关系: 继承 指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父 ...

  5. SpringBean_获取Spring加载的所有bean(实践)

      一.查询代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3 ...

  6. MySQL学习

    关于MySQL学习,先推荐一个网站,资源很多.讲得很细 StudyMySQL-最好的MySQL学习网站 我的MySQL学习之旅: 1.简单了解下MySQL数据库,安装MySQL.MySQL管理工具(刚 ...

  7. 使用css3 实现太阳升起落下效果

    <!DOCTYPE html><html style="overflow: hidden"><head> <meta http-equiv ...

  8. 教你一招:EXCEL单元格随机生成字母

    =CHAR(RANDBETWEEN(1,4)+65) 65代表大写字母A,依次类推 1代表从A开始 4代表到D结束

  9. bzoj3033

    欧拉路,这题好神啊QAQ 显然选择的方案数有2^n种,因为每个点度数都为二所以肯定是一条欧拉路, 第二问直接爆搜即可... ----然而我并没有想到---- 第一问我推出来了(别问我怎么推的,我说我是 ...

  10. 【Codefoces487E/UOJ#30】Tourists Tarjan 点双连通分量 + 树链剖分

    E. Tourists time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard inpu ...