ThinkPHP中获取指定日期后工作日的具体日期方法


Posted in PHP onOctober 14, 2018

思路:

1、获取到查询年份内所有工作日数据数组
2、获取到查询开始日期在工作日的索引
3、计算需查询日期索引
4、获得查询日期

/*创建日期类型记录表格*/

CREATE TABLE `tb_workday` (

`did` int(11) NOT NULL AUTO_INCREMENT,

`exact_date` varchar(32) NOT NULL COMMENT '具体日期:格式date("Ymd");(20170205)',

`date_year` varchar(32) NOT NULL COMMENT '具体日期:格式date("Y");(2017)',

`date_type` tinyint(2) NOT NULL COMMENT '日期类型:0、工作日;1、特殊工作日;2、法定节假日',

PRIMARY KEY (`did`)

) ENGINE=InnoDB AUTO_INCREMENT=829 DEFAULT CHARSET=utf8 COMMENT='各年工作日&法定节假日数据'
<?php

 

class work_days

{

 /**

 * 获取星期

 * @param $date

 * @return mixed

 */

 function get_week($date)

 {

 //强制转换日期格式

 $date_str = date('Y-m-d', strtotime($date));

 //封装成数组

 $arr = explode("-", $date_str);

 //参数赋值

 //年

 $year = $arr[0];

 //月,输出2位整型,不够2位右对齐

 $month = sprintf('%02d', $arr[1]);

 //日,输出2位整型,不够2位右对齐

 $day = sprintf('%02d', $arr[2]);

 //时分秒默认赋值为0;

 $hour = $minute = $second = 0;

 //转换成时间戳

 $strap = mktime($hour, $minute, $second, $month, $day, $year);

 //获取数字型星期几

 $number_wk = date("w", $strap);

 

 //获取数字对应的星期

 return $number_wk;

 

 //自定义星期数组

 //$weekArr = array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六");

 

 //获取数字对应的星期

 //return $weekArr[$number_wk];

 }

 

 

 /**

 * 获取指定日期段内每一天的日期

 * @param string $startdate 开始日期

 * @param string $enddate 结束日期

 * @return array

 */

 function getDateFromRange($startdate, $enddate)

 {

 $stimestamp = strtotime($startdate);

 $etimestamp = strtotime($enddate);

 

 // 计算日期段内有多少天

 $days = ($etimestamp - $stimestamp) / 86400 + 1;

 

 // 保存每天日期

 $_list_date = array();

 for ($i = 0; $i < $days; $i++) {

 $_list_date[] = date('Y-m-d', $stimestamp + (86400 * $i));

 }

 return $_list_date;

 }

 

 function curl_post($url, $data = null)

 {

 $curl = curl_init();

 curl_setopt($curl, CURLOPT_URL, $url);

 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);

 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);

 if (!empty($data)) {

 curl_setopt($curl, CURLOPT_POST, 1);

 curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

 }

 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

 $output = curl_exec($curl);

 curl_close($curl);

 return $output;

 }

 

 /**

 * 更新数据库指定年份日期数据

 * @param $year

 * @return int

 */

 function updateDate($year)

 {

 $startDate = date('Y-m-d', strtotime($year . '-01-01'));

 $endDate = date('Y-m-d', strtotime('+1 year', strtotime($startDate)) - 86400);

 $_list_date = self::getDateFromRange($startDate, $endDate);

 

 $url = 'http://api.goseek.cn/Tools/holiday';//自行查找的免费API

 

 $m = M('tb_workday');

 $count = 0;

 

 foreach ($_list_date as $k => $_date) {

 $_ret = 0;

 $_date = date('Ymd', strtotime($_date));

 $_post_data = array('date' => $_date);

 $_ret_curl = curl_post($url, $_post_data);

 $_ret_curl = json_decode($_ret_curl, true);

 

 //工作日

 if ($_ret_curl['data'] == 0) {

 $dateData['exact_date'] = $_date;

 $dateData['date_year'] = $year;

 $dateData['date_type'] = 0;

 $_ret = $m->add($dateData) ? 1 : 0;

 unset($dateData);

 

 

 //工作日 判断是否为周末

 if (in_array(self::get_week($_date), array(0, 1))) {

  //特殊工作日

  $dateData['exact_date'] = $_date;

  $dateData['date_year'] = $year;

  $dateData['date_type'] = 1;

  $_ret = $m->add($dateData) ? 1 : 0;

  unset($dateData);

 }

 }

 

 //法定节假日

 if ($_ret_curl['data'] == 2) {

 $dateData['exact_date'] = $_date;

 $dateData['date_year'] = $year;

 $dateData['date_type'] = 2;

 $_ret = $m->add($dateData) ? 1 : 0;

 unset($dateData);

 }

 

 //休息日(周末) 暂不处理

 /*if ($_ret_curl['data'] == 1) {

 

 }*/

 $_ret && $count++;

 unset($_date, $_post_data, $_ret_curl, $_ret);

 }

 return $count;

 }

 

 /**

 * 获取当年所有工作日 (从数据库获取,数据库无数据则先更新数据)

 * @param string $year 当年年份

 * @return array

 */

 private function getWorkDays($year)

 {

 $m = M('tb_workday');

 $map['date_year'] = $year;

 $map['date_type'] = 0;

 $DateArray = $m->field('exact_date')->where($map)->select();

 if (!empty($DateArray)) {

 $DateArray = array_column($DateArray, 'exact_date');

 return $DateArray;

 } else {

 //更新数据库工作日数据

 $ret = self::updateDate($year);

 if ($ret > 0) {

 return self::getWorkDays($year);

 } else {

 return false;

 }

 }

 }

 

 /**

 * 获取开始日期后第N个工作日具体日期

 * @param $startdate string 计算开始日期 需包含年月日信息

 * @param $days int 间隔天数

 * @return mixed 成功返回 对应日期,失败返回false

 */

 public function getNextWorkDate($startdate, $days)

 {

 $year = date('Y', strtotime($startdate));

 $startdate = date('Y-m-d', strtotime($startdate));

 

 $workDays = $this->getWorkDays($year);

 

 $search_key = array_search(date('Ymd', strtotime($startdate)), $workDays);

 

 if ($search_key === false) {//查询日期为非工作

 //获取查询日期前最近工作日

 $m = M('tb_workday');

 $map['date_year'] = $year;

 $map['date_type'] = 0;

 $map['DATE_FORMAT(`exact_date`,\'%Y-%m-%d\')'] = array('LT', $startdate);

 $_search_date = $m->where($map)->order('`exact_date` DESC')->getField('exact_date');

 $search_key = array_search($_search_date, $workDays);

 unset($m, $map, $_search_date);

 }

 

 $t_key = $search_key + $days;

 

 if ($t_key <= count($workDays) - 1) {

 return date('Y-m-d', strtotime($workDays[$t_key]));

 } else {

 //查询日期已跨年

 $n_days = $days - (count($workDays) - 1 - $search_key);

 $next_year = $year + 1;

 return $this->getNextWorkDate($next_year . '-01-01', $n_days - 1);

 }

 }

}

 

 

$startdate = '2018-09-28';

$days = 5;

 

$class = new work_days();

$_date_workday = $class->getNextWorkDate($startdate, $days);

echo $_date_workday;//2018-10-10

以上代码大家可以在本地测试一下,感谢大家对三水点靠木的支持。

PHP 相关文章推荐
不用数据库的多用户文件自由上传投票系统(1)
Oct 09 PHP
IIS+PHP+MySQL+Zend配置 (视频教程)
Dec 13 PHP
php中用于检测一个地理IP地址是否可用的代码
Feb 19 PHP
php读取mysql中文数据出现乱码的解决方法
Aug 16 PHP
从PHP $_SERVER相关参数判断是否支持Rewrite模块
Sep 26 PHP
PHP连接SQLServer2005方法及代码
Dec 26 PHP
PHP将session信息存储到数据库的类实例
Mar 04 PHP
java模拟PHP的pack和unpack类
Apr 13 PHP
微信支付开发动态链接Native支付
Jul 12 PHP
PHP使用xpath解析XML的方法详解
May 20 PHP
php批量修改表结构实例
May 24 PHP
PHP定义字符串的四种方式详解
Feb 06 PHP
php实现数组中出现次数超过一半的数字的统计方法
Oct 14 #PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
Oct 14 #PHP
PHP中常见的密码处理方式和建议总结
Oct 14 #PHP
PHP如何根据文件头检测文件类型实例代码
Oct 14 #PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
Oct 14 #PHP
PHP按一定比例压缩图片的方法
Oct 12 #PHP
PHP实现图片压缩
Sep 09 #PHP
You might like
jQuery+PHP实现的掷色子抽奖游戏实例
2015/01/04 PHP
Zend Framework创建自己的动作助手详解
2016/03/05 PHP
php实用代码片段整理
2016/11/12 PHP
thinkPHP5实现数据库添加内容的方法
2017/10/25 PHP
PHP中引用类型和值类型功能与用法示例
2019/02/26 PHP
PHP论坛实现积分系统的思路代码详解
2020/06/01 PHP
jquery 笔记 事件
2011/11/02 Javascript
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
javascript中的if语句使用介绍
2013/11/20 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
2015/09/30 Javascript
js判断输入字符串是否为空、空格、null的方法总结
2016/06/14 Javascript
javascript和jQuery实现网页实时聊天的ajax长轮询
2016/07/20 Javascript
无法获取隐藏元素宽度和高度的解决方案
2017/03/07 Javascript
最常用的jQuery表单验证(简单)
2017/05/23 jQuery
微信小程序全局变量改变监听的实现方法
2019/07/15 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
编写自定义的Django模板加载器的简单示例
2015/07/21 Python
Python 多线程抓取图片效率对比
2016/02/27 Python
Python算术运算符实例详解
2017/05/31 Python
opencv改变imshow窗口大小,窗口位置的方法
2018/04/02 Python
python自动化报告的输出用例详解
2018/05/30 Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
2019/08/20 Python
Python数据存储之 h5py详解
2019/12/26 Python
Win 10下Anaconda虚拟环境的教程
2020/05/18 Python
Spartoo荷兰:鞋子、包包和服装
2018/07/12 全球购物
软件测试面试题
2015/10/21 面试题
青春励志演讲稿
2014/04/29 职场文书
职务说明书范文
2014/05/07 职场文书
新党章心得体会
2014/09/04 职场文书
上课说话检讨书500字
2014/11/01 职场文书
李白经典诗之一:全文无一“月”字,却句句有月
2019/07/12 职场文书
MySQL 时间类型的选择
2021/06/05 MySQL
MySQL 百万级数据的4种查询优化方式
2021/06/07 MySQL
Python Matplotlib绘制动画的代码详解
2022/05/30 Python