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.ini以达到屏蔽错误信息并记录日志
Jun 16 PHP
php生成缩略图示例代码分享(使用gd库实现)
Jan 20 PHP
检查用户名是否已在mysql中存在的php写法
Jan 20 PHP
PHP中构造函数和析构函数解析
Oct 10 PHP
PHP清除数组中所有字符串两端空格的方法
Oct 20 PHP
为你总结一些php信息函数
Oct 21 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
Apr 11 PHP
浅谈PHP的反射机制
Dec 15 PHP
php实现用户登陆简单实例
Apr 04 PHP
PHP实现图片的等比缩放和Logo水印功能示例
May 04 PHP
yii2.0整合阿里云oss删除单个文件的方法
Sep 19 PHP
php ajax confirm 删除实例详解
Mar 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
PHP安全配置详细说明
2011/09/26 PHP
PHP创建桌面快捷方式的实例代码
2014/02/17 PHP
php使用Session和文件统计在线人数
2015/07/04 PHP
thinkPHP5.0框架开发规范简介
2017/03/25 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
document.createElement()用法及注意事项(ff下不兼容)
2013/03/13 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
浅谈JavaScript中定义变量时有无var声明的区别
2014/08/18 Javascript
javascript制作2048游戏
2015/03/30 Javascript
JavaScript 七大技巧(二)
2015/12/13 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
js实现统计字符串中特定字符出现个数的方法
2016/08/02 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
2018/01/18 Javascript
详解微信小程序开发(项目从零开始)
2019/06/06 Javascript
解决vue单页面应用中动态修改title问题
2019/06/09 Javascript
vue中更改数组中属性,在页面中不生效的解决方法
2019/10/30 Javascript
原生js实现随机点名功能
2019/11/05 Javascript
ES6 async、await的基本使用方法示例
2020/06/06 Javascript
解决vue props传Array/Object类型值,子组件报错的情况
2020/11/07 Javascript
[03:07]DOTA2英雄基础教程 冰霜诅咒极寒幽魂
2013/12/06 DOTA
[03:44]2015国际邀请赛选手档案—Cloud9.NoTail
2015/07/28 DOTA
浅谈Python中chr、unichr、ord字符函数之间的对比
2016/06/16 Python
python中解析json格式文件的方法示例
2017/05/03 Python
python使用原始套接字发送二层包(链路层帧)的方法
2019/07/22 Python
python能在浏览器能运行吗
2020/06/17 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
Python pip 常用命令汇总
2020/10/19 Python
Sentry错误日志监控使用方法解析
2020/11/12 Python
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
无谷物狗粮:Pooch & Mutt
2018/05/23 全球购物
学生实习介绍信
2014/01/15 职场文书
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
民事起诉书范本
2015/05/19 职场文书
Python实现仓库管理系统
2022/05/30 Python
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android