php获取N天后的日期,排除周末与节假日加上调休日

代码如下.

/**
* 求取从某日起经过一定天数后的日期,
* 排除周六周日和节假日加上调休日
* @param $start    int|string   开始日期
* @param $offset   int   经过天数
* @param $exception string|array 节假日
* @param $allow   string|array    调休日
* @return string
*  examples:输入(2021-01-09,36,''),得到2021-03-09
*/
function getendday( $start='now', $offset=0, $exception='', $allow='' )
{date_default_timezone_set('prc');//先计算不排除周六周日及节假日的结果if (is_numeric($start)){$starttime = $start;}else{$starttime = strtotime($start);}$endtime = $starttime + $offset * 24 * 3600;$end = date('Y-m-d', $endtime);//然后计算周六周日引起的偏移$weekday = date('w', $starttime);//得到星期值:0-6if ($weekday == 0){//0是星期天$weekday = 7;}$remain = $offset % 7;$newoffset = 2 * ($offset - $remain) / 7;//每一周需重新计算两天if ($remain > 0) {//周余凑整$tmp = $weekday + $remain;if ($tmp >= 7) {$newoffset += 2;} else if ($tmp == 6) {$newoffset += 1;}//考虑当前为周六周日的情况if ($weekday == 6) {$newoffset -= 1;} else if ($weekday == 7) {$newoffset -= 2;}}//再计算节假日引起的偏移if (is_array($exception)) {//多个节假日foreach ($exception as $day) {$tmp_time = strtotime($day);if ($tmp_time > $starttime && $tmp_time <= $endtime) {//在范围(a,b]内$weekday_t = date('w', $tmp_time);if ($weekday_t <= 5 && $weekday_t != 0) {//防止节假日与周末重复$newoffset += 1;}}}}else {//单个节假日if (!empty($exception)) {$tmp_time = strtotime($exception);if ($tmp_time > $starttime && $tmp_time <= $endtime) {$weekday_t = date('w', $tmp_time);if ($weekday_t <= 5 && $weekday_t != 0) {$newoffset += 1;}}}}//再计算调休日引起的偏移if (is_array($allow)) {//多个调休日foreach ($allow as $day) {$tmp_time = strtotime($day);if ($tmp_time > $starttime && $tmp_time <= $endtime) {//在范围(a,b]内$weekday_t =  date('w', $tmp_time);//得到星期值:0-6if ($weekday_t == 6 || $weekday_t == 0) {//若调休日是星期六、星期日$newoffset -= 1;}}}}else {//单个调休日if (!empty($allow)) {$tmp_time = strtotime($allow);if ($tmp_time > $starttime && $tmp_time <= $endtime) {$weekday_t = date('w', $tmp_time);if ($weekday_t == 6 || $weekday_t == 0) {//若调休日是星期六、星期日$newoffset -= 1;}}}}//根据偏移天数,递归做等价运算if($newoffset > 0){#echo "[{$start} -> {$offset}] = [{$end} -> {$newoffset}]"."<br />n";return getendday($end,$newoffset,$exception,$allow);}else{return $end;}
}

php获取N天后的日期,排除周末与节假日加上调休日相关推荐

  1. java获取n个工作日后的日期, 排除周末和节假日(顺延)

    java获取n个工作日后的日期, 排除周末和节假日(顺延) 一.需求分析 需求描述 思路解析 二.以下为测试代码(测试时日期为2018-08-28) 三.应用 1.首先看一下我数据库中存放的holid ...

  2. js获取n天后的日期

    1. 获取n天后的日期, n可为正数,可以为负数 /*** 计算n天后的日期* initDate:开始日期,默认为当天日期, 格式:yyyymmdd/yyyy-mm-dd* days:天数* flag ...

  3. Java Date类型格式化,不同日期格式转换,获取N天后的日期,CommonUtil工具

    文章目录 Date类型格式化为各种格式字符串 不同日期格式的字符串之间的转换 获取N天后的日期 实用工具类库common-util使用 参考链接 Date类型格式化为各种格式字符串 java 日期格式 ...

  4. php判断是否节假日,php 排除周末与节假日程序实例代码

    date_default_timezone_set('prc');/*** 求取从某日起经过一定天数后的日期,* 排除周六周日和节假日* @param $start       开始日期* @para ...

  5. java假期顺延求一个日期n天后的日期(排除节假日及周六周日)

    1,引入hutool工具类jar <dependency><groupId>cn.hutool</groupId><artifactId>hutool- ...

  6. java获取7天后的日期_java 获取最近7天 最近今天的日期

    private static Date getDateAdd(int days){ SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-d ...

  7. 节日代码php,php 排除周末与节假日程序实例代码

    0 ){//周余凑整 $tmp = $weekday + $remain; if( $tmp >= 7 ){ $newoffset += 2; }else if( $tmp == 6 ){ $n ...

  8. access下半年月份是几月份_Access获取某年某月后的日期

    有网友好奇想知道100天后的日期是什么年月日.因为这个日子对她来说是比较重要的. 可以用参数指定某个日期的年,月,日 其中每个年参数的取值范围为:从 100 到 9999 间的整数 只需要在今天的日期 ...

  9. php获取7天,php 获取未来七天的日期和星期

    php获取未来七天的日期和星期代码 for($i=4;$i<8;$i++){ $dateArray[$i]=date('Y-m-d',strtotime(date('Y-m-d').'+'.$i ...

最新文章

  1. 【Smart_Point】C/C++ 中独占指针unique_ptr
  2. 思考:通过MMU/TLB/Cache对安全内存攻击的可能性
  3. 春运前五日全国累计发送旅客3.49亿人次 同比增0.58%
  4. SAP 电商云 Spartacus UI 回归测试 checkout-flow.core-e2e-spec.ts
  5. linux mysql 静态库_Linux静态库与动态库实例详解
  6. python接口编程_Python 中的面向接口编程
  7. java mybatis 搭建_mybatis环境搭建(转载)
  8. C语言实现成块数据读写操作 fread() fwrite()
  9. FastCGI 使用介绍
  10. 纯虚函数的一些问题和注意事项
  11. 软件工程毕设(六)·论文
  12. 实验01 使用网络协议分析仪Wireshark
  13. [ P1 ] 雷达相机标定基本知识
  14. 服务器硬盘坏道修复教程视频,硬盘坏道修复工具使用教程
  15. 按摩新方法(辅助药物治疗肝,肾,肺等慢性疾病)
  16. 最新Android框架排行榜。
  17. BootStrap富文本编辑器Summernote
  18. 购买重疾险是不是都要先去体检?千万不要!
  19. 【WPS表格】创建表格,汇总行
  20. 软硬结合——写给硬件开发工程师的全栈入门实战

热门文章

  1. 推荐30款开源项目管理软件
  2. Sklearn学习_03特征选择
  3. 图像配准:从SIFT到深度学习
  4. 企业数字化转型值得一看:送你高级配色方案,附赠多款酷炫大屏
  5. 记一次TL-R479-GPE-AC V4.0 SSH破解
  6. CPU与外设传输数据的方式
  7. 黑马程序员-----Java基础-----IO流-3
  8. 最近朋友圈晒足迹足迹刷屏_如何在Android上使用私人浏览隐藏您的足迹
  9. 犯了非法侵入计算机信息系统罪既遂怎么处罚
  10. Vijos P1098合唱队形