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. 初学C#和MVC的一些心得,弯路,总结,还有教训(4)--Cache 关于创建多个缓存实例

    asp.net中的数据缓存可以用 HttpRuntime.Cache ,这个是大家都知道的,但如果缓存的数据比较多,又比较杂乱,想要把缓存分开管理(也就是创建多个缓存实例)应该怎么做呢... 于是常规 ...

  2. 如何判断自己的VPS是那种虚拟技术实现的

    我们知道VPS的虚拟技术有许多种,如Openvz.Xen.VMware vSphere.Hyper-V.KVM及Xen的HVM与PV等.在Xen中pv是半虚拟化,hvm是全虚拟化,pv只能用于linu ...

  3. SpringBoot源码分析:spring的基本架构

    在深入了解springboot之前,我们需要了解spring,springboot本身就是基于spring而构建:是微服务架构中一个比较流行的框架:类似spring提供了一套完整的微服务方案如spri ...

  4. Alpha阶段第六次Scrum Meeting

    情况简述 Alpha阶段第六次Scrum Meeting 敏捷开发起始时间 2016/10/27 00:00 敏捷开发终止时间 2016/10/28 00:00 会议基本内容摘要 提出了目前阶段遇到的 ...

  5. HTTP协议—— 简单认识TCP/IP协议

    大学没读计算机专业,所以很多的专业知识都不知道.既然已经从事了IT这个行业,就势必要去了解下网络底层,虽然实际工作中这些东西用不到.高楼大厦,起于平川.不积跬步,无以至千里,不积小流,无以成江海.我现 ...

  6. HDU1086You can Solve a Geometry Problem too(判断线段相交)

    You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3 ...

  7. BZOJ3489: A simple rmq problem

    设$i$的前驱为$p_i$,后继为$q_i$,把询问看成点$(L,R)$,有贡献的$i$满足$L\in(p_i,i]$且$R\in[i,q_i)$,询问的就是覆盖这个点的矩形的最大值.那么可以用可持久 ...

  8. SDL 显示解码后的yuv12数据

    在上篇h264解码为yuv12后http://jhlong12345.blog.163.com/blog/static/1230631292015725115058709/ ,需要显示出来,使用sdl ...

  9. 谷歌地图地理解析和反解析geocode.geocoder详解

    地址解析就是将地址(如:贵州省贵阳市)转换为地理坐标(如经度:106.71,纬度:26.57)的过程. 地理反解析和上面的过程相反是将地理坐标(如纬度:26.57,经度:106.71)转换为地址(中国 ...

  10. XML编码utf-8有中文无法解析或乱码 C#

    XML的encoding="UTF-8" ,含有中文的话(部分)会出现乱码. 网上还是很多这类问题跟解决办法的. 表现为用ie或者infopath之类的xml软件打不开这个xml, ...