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 相关文章推荐
关于尾递归的使用详解
May 02 PHP
php中判断数组是一维,二维,还是多维的解决方法
May 04 PHP
FireFox浏览器使用Javascript上传大文件
Oct 30 PHP
2014过年倒计时示例
Jan 31 PHP
thinkphp实现数组分页示例
Apr 13 PHP
Yii的CDbCriteria查询条件用法实例
Dec 04 PHP
php获取twitter最新消息的方法
Apr 14 PHP
thinkphp验证码的实现(form、ajax实现验证)
Jul 28 PHP
php base64 编码与解码实例代码
Mar 21 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
Dec 21 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 PHP
YII框架实现自定义第三方扩展操作示例
Apr 26 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
超级简单的php+mysql留言本源码
2009/11/11 PHP
php 模拟 asp.net webFrom 按钮提交事件的思路及代码
2013/12/02 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
Prototype中dom对象方法汇总
2008/09/17 Javascript
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
jquery 图片截取工具jquery.imagecropper.js
2010/04/09 Javascript
jQuery 淡出一个图像到另一个图像的实现代码
2013/06/12 Javascript
javascript框架设计之类工厂
2015/06/23 Javascript
基于jQuery实现复选框是否选中进行答题提示
2015/12/10 Javascript
jquery模拟实现鼠标指针停止运动事件
2016/01/12 Javascript
让图片跳跃起来  javascript图片轮播特效
2016/02/16 Javascript
在React框架中实现一些AngularJS中ng指令的例子
2016/03/06 Javascript
Vue过滤器的用法和自定义过滤器使用
2017/02/08 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
jQuery实现百度登录框的动态切换效果
2017/04/21 jQuery
vue.js中mint-ui框架的使用方法
2017/05/12 Javascript
ES6新特性:使用export和import实现模块化详解
2017/07/31 Javascript
微信小程序解析富文本过程详解
2019/07/13 Javascript
layui的数据表格+springmvc实现搜索功能的例子
2019/09/28 Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
2020/02/12 Javascript
浅谈TypeScript的类型保护机制
2020/02/23 Javascript
python的变量与赋值详细分析
2017/11/08 Python
python实现感知器算法详解
2017/12/19 Python
Python基于pyCUDA实现GPU加速并行计算功能入门教程
2018/06/19 Python
pandas去重复行并分类汇总的实现方法
2019/01/29 Python
Python3中FuzzyWuzzy库实例用法
2020/11/18 Python
详解CSS3中nth-child与nth-of-type的区别
2017/01/05 HTML / CSS
MySQL面试题
2014/01/12 面试题
团日活动策划书
2014/02/01 职场文书
经济类毕业生求职信
2014/06/26 职场文书
不错的求职信范文
2014/07/20 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
计生个人工作总结
2015/02/28 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书
六年级情感作文之500字
2019/10/23 职场文书
golang 实用库gotable的具体使用
2021/07/01 Golang