PHP获取一段时间内的每个周几, 每月几号, 遇到特殊日子就往后延
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获取一段时间内的每个周几, 每月几号, 遇到特殊日子就往后延的更多相关文章
- java根据日期获取周几和获取某段时间内周几的日期
整理两个日期的方法. 根据日期获取当天是周几 /** * 根据日期获取当天是周几 * @param datetime 日期 * @return 周几 */ public static String d ...
- oracle获取一段时间内所有的小时、天、月
获取一段时间内所有的小时 ) sdate FROM dual CONNECT ; 获取一段时间内所有的天 sdate FROM dual CONNECT ; from user_objects whe ...
- Java 获取一段时间内的每一天
有时候我们会遇到一些业务场景,需要去获取一段时间内的每一天日期 public static List<Date> findDates(Date dBegin, Date dEnd) { L ...
- java获取某段时间内的月份列表
/**获取两个时间节点之间的月份列表**/ private static List<String> getMonthBetween(String minDate, String maxDa ...
- JS 获取一段时间内的工作时长小时数
本来想是想找轮子的,但是并没有找到能用的,多数都是问题很大,所以就自己写了一个 需求说明 支持自选时间段,即开始时间与结束时间根据用户的上班及下班时间判定返回小时数 技术栈 moment.js 思考过 ...
- 用sql获取一段时间内的数据
我把我CSDN写的 搬来博客园了.. SELECT * FROM 表名 WHERE timestampdiff(MINUTE, SYSDATE(), send_time) <=60 AND ...
- mysql 获取一段时间的数据
用 sql 获取一段时间内的数据: SELECT * FROM EDI.edi_history WHERE timestampdiff(day, SYSDATE(), create_time_loc) ...
- 利用zabbix API 统计一段时间内监控项的均值和峰值
#coding:utf-8 #给定主机IP获取一段时间内cpu的均值和峰值并写入文件(txt,可以跑完后直接把后缀名改为csv以表格形式打开):需要指定IP文件 import requests imp ...
- Java得到的一周的最后一天的一段时间内
Java得到的一周的最后一天的一段时间内 1.设计源代码 LastDayOfWeek.java: /** * @Title:LastDayOfWeek.java * @Package:com.you. ...
随机推荐
- sql 函数 汉字转拼音
GO /****** Object: UserDefinedFunction [dbo].[fn_GetPy] Script Date: 2017/1/4 10:53:49 ******/ SET A ...
- 在CSS中定义a:link、a:visited、a:hover、a:active顺序
摘自:http://blog.snsgou.com/post-2.html 以前用CSS一直没有遇到过这个问题,在最近给一个本科同学做的项目里面.出现一些问题,搜索引擎查了一些网站和资料,发现 ...
- 几种display:table-cell的应用
一.display:table-cell属性简述 display:table- cell属性指让标签元素以表格单元格的形式呈现,类似于td标签.目前IE8+以及其他现代浏览器都是支持此属性的,但是IE ...
- 2016-2017-2 《Java程序设计》预备作业2总结
2016-2017-2 <Java程序设计>预备作业2总结 古希腊学者普罗塔戈说过:「头脑不是一个要被填满的容器,而是一束需要被点燃的火把.」 在对计算机系的学生情况的调查中,我说: 最近 ...
- js 获取时间间隔
现在感觉sublime IDE 用着比较方便,也比较美观,不知道大家用的是啥ide.
- php基础知识整理
记录一些php容易忽略的基础知识点 include和require的区别 require和include都表示引入指定文件,主要区别有几点 1.加载失败处理方式不同 include在引入不存文件时产 ...
- JS点击更换网页背景颜色
JS部分 <script type="text/javascript"> // 定义可换的颜色 var colors = ["#ff0000", & ...
- IIS如何配置可以下载APK、IPA文件
解决步骤: 1).打开IIS服务管理器,找到服务器,右键-属性,打开IIS服务属性: 2.单击MIME类型下的“MIME类型”按钮,打开MIME类型设置窗口: 3).单击“新建”,建立新的MIME类型 ...
- js 数据类型 typeof的测试
, t2 = ', t3 = null, t4 = NaN, t5 = undefined, t6 = function() {}, t7 = true, t8 = window, t9 = docu ...
- 使用Nominatim进行openstreetmap地址搜索/解析
Nominatim(来自拉丁语,意思是“名称”)是一个可以按名称和地址来搜索OSM中的数据,并生成OSM点的合成地址的工具(反向地理编码).可用在http://nominatim.openstreet ...