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. ...
随机推荐
- HTML标记语言篇--学习笔记01
HTML标记语言篇 第1章 HTML基础 1.1 基本概念 WWW 是"World Wide Web"(全球广域网)的缩写,简称为Web,中文又称为"万维网" ...
- 【笔记3】用pandas实现矩阵数据格式的推荐算法 (基于用户的协同)
原书作者使用字典dict实现推荐算法,并且惊叹于18行代码实现了向量的余弦夹角公式. 我用pandas实现相同的公式只要3行. 特别说明:本篇笔记是针对矩阵数据,下篇笔记是针对条目数据. ''' 基于 ...
- Moto C118 基于 Osmocom-BB 和 OpenBTS 搭建小型GSM短信基站
此文章PDF文档下载地址:点击下载 0x00 写在前面 大家应该都听说过摩托罗拉C118配合Osmocom-BB实现GSM网络下的短信拦截功能吧,在14年左右新出了一种玩法就是Osmocom-BB的s ...
- 怎样让 Web 项目暴露在外的服务坚不可摧?
Web 项目一般给特定人群使用,有些是局域网用户量不足1K的内部系统,也有些广域网用户上万的中型项目,当然还有用户上亿的大型项目. 这些大大小小的 Web 项目都会有用户登录的存在,登录后有特定的权限 ...
- ionic 开发笔记
1.AngularJS 外部的控制器(DOM 事件.外部的回调函数如 jQuery UI 空间等)调用了 AngularJS 函数之后,必须调用$apply.在这种情况下,你需要命令 AngularJ ...
- react 和 ractive的区别
前面进项目的时候同事说项目在用react. 我没有深究,实际中发现是ractive.js.后来发现其实另有一个react.js.和ractive.js是有区别的.不过也有相似的地方. react项目的 ...
- java中Arraylist复制方法
方法一: ArrayList<Integer> mycopy=new ArrayList<Integer>(); mycopy=(ArrayList<Integer> ...
- 不可错过的javascript迷你库
最近看着下自己的github star,把我吓坏了,手贱党,收藏癖的我都收藏了300+个仓库了,是时候整理一下了. Unix主张kiss,小而美被实践是最好用的,本文将介绍笔者收集的一些非常赞的开源库 ...
- 使用powershell链接到Azure
一:针对传统的的Azure 的登陆界面: (ASM) 1. 正常来说是 现在本地创建证书文件,然后上传文件,以便本地计算机和Azure建立可靠的安全连接 Get-AzurePublishSetting ...
- hihoCoder #1445 : 后缀自动机二·重复旋律5
#1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...