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 相关文章推荐
PHP集成FCK的函数代码
Sep 27 PHP
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
Oct 12 PHP
详解php的魔术方法__get()和__set()使用介绍
Sep 19 PHP
php实现单链表的实例代码
Mar 22 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
Jun 23 PHP
DOM基础及php读取xml内容操作的方法
Jan 23 PHP
phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
Feb 03 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
Oct 29 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
Nov 03 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
Nov 03 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
Aug 27 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 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
高分R级DC动画剧《哈莉·奎茵》第二季正式预告首发
2020/04/09 欧美动漫
php中邮箱地址正则表达式实现与详解
2012/04/24 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
2014/11/29 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
Laravel框架创建路由的方法详解
2019/09/04 PHP
jQuery 动态酷效果实现总结
2009/12/27 Javascript
javascrip客户端验证文件大小及文件类型并重置上传
2011/01/12 Javascript
让你的CSS像Jquery一样做筛选的实现方法
2011/07/10 Javascript
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
2013/05/08 Javascript
jQuery实现div浮动层跟随页面滚动效果
2014/02/11 Javascript
JavaScript中对象属性的添加和删除示例
2014/05/12 Javascript
js使用html()或text()方法获取设置p标签的显示的值
2014/08/01 Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
2015/05/06 Javascript
JS操作XML实例总结(加载与解析XML文件、字符串)
2015/12/08 Javascript
JS实现获取剪贴板内容的方法
2016/06/21 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
Vue3 中的数据侦测的实现
2019/10/09 Javascript
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
2020/06/23 Javascript
[01:51]历届DOTA2国际邀请赛举办地回顾 TI9落地上海
2018/08/26 DOTA
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
用Python中的__slots__缓存资源以节省内存开销的方法
2015/04/02 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
Python实现判断一个字符串是否包含子串的方法总结
2017/11/21 Python
Python基于ThreadingTCPServer创建多线程代理的方法示例
2018/01/11 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
Python常用模块之requests模块用法分析
2019/05/15 Python
Python交互式图形编程的实现
2019/07/25 Python
基于Pytorch SSD模型分析
2020/02/18 Python
django xadmin 管理器常用显示设置方式
2020/03/11 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
2020/03/23 Python
北美领先的牛仔品牌:Buffalo David Bitton
2017/05/22 全球购物
size?丹麦官网:英国伦敦的球鞋精品店
2019/04/15 全球购物
函授自我鉴定范文
2014/02/06 职场文书
廉洁自律个人总结
2015/02/14 职场文书
三十年同学聚会感言
2015/07/30 职场文书
宣传部部长竞选稿
2015/11/21 职场文书