IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 计算多少工作日后的日期 -> 正文阅读

[PHP知识库]计算多少工作日后的日期

<?php

class BusinessDaysCalculator {

    const MONDAY    = 1;
    const TUESDAY   = 2;
    const WEDNESDAY = 3;
    const THURSDAY  = 4;
    const FRIDAY    = 5;
    const SATURDAY  = 6;
    const SUNDAY    = 7;

    /**
     * @param DateTime   $startDate       Date to start calculations from
     * @param DateTime[] $holidays        Array of holidays, holidays are no conisdered business days.
     * @param DateTime[]      $nonBusinessDays Array of days of the week which are not business days.
     *  @param DateTime[]      $specialBusinessDay Array is the special work day.
     */
    public function __construct(DateTime $startDate, array $holidays, array $nonBusinessDays ,array $specialBusinessDay) {
        $this->date = $startDate;
        $this->holidays=[];
        foreach($holidays as $holiday){
            array_push($this->holidays,new DateTime($holiday));
        }
        $this->nonBusinessDays = $nonBusinessDays;
        $this->specialBusinessDay = $specialBusinessDay;
    }

    public function addBusinessDays($howManyDays) {
        $i = 0;
        while ($i < $howManyDays) {
            $this->date->modify("+1 day");
            if ($this->isBusinessDay($this->date)) {
                $i++;
            }
        }
    }

    public function getDate() {
        return $this->date->format('Y-m-d');
    }

    private function isBusinessDay(DateTime $date) {
        if(in_array($date->format('Y-m-d') , $this->specialBusinessDay)) return true; //判断当前日期是否是因法定节假日调休而上班的周末,这种情况也算工作日

        if (in_array((int)$date->format('N'), $this->nonBusinessDays)) {
            return false; //当前日期是周末
        }

        foreach ($this->holidays as $day) {
            if ($date->format('Y-m-d') == $day->format('Y-m-d')) {
                return false; //当前日期是法定节假日
            }
        }

        return true;
    }

}

$holidays=["2017-01-27","2017-01-28","2017-01-29","2017-01-30","2017-01-31","2017-02-01","2017-02-02"];//从聚合数据接口获得
$specialBusinessDay=["2017-01-22"];//因法定节假日调休而上班的周末,这种情况也算工作日.因为这种情况少,可以通过手动配置
$calculator = new BusinessDaysCalculator(
    new DateTime(), //当前时间
    $holidays,
    [BusinessDaysCalculator::SATURDAY, BusinessDaysCalculator::SUNDAY],
    $specialBusinessDay
);

$calculator->addBusinessDays(120); // 120个工作日后的时间

$afterBusinessDay=$calculator->getDate();
echo $afterBusinessDay;

这是来自于网络的,本地测试正常改写成TP扩展类就出现错误。

发现TP对datetime 支持性有点问题,改成time()时间缀械式。

<?php

class BusinessDaysCalculator {

    const MONDAY    = 1;
    const TUESDAY   = 2;
    const WEDNESDAY = 3;
    const THURSDAY  = 4;
    const FRIDAY    = 5;
    const SATURDAY  = 6;
    const SUNDAY    = 0;

    /**
     * @param DateTime   $startDate       Date to start calculations from
     * @param DateTime[] $holidays        Array of holidays, holidays are no conisdered business days.
     * @param DateTime[]      $nonBusinessDays Array of days of the week which are not business days.
     *  @param DateTime[]      $specialBusinessDay Array is the special work day.
     */
    public function __construct(int $startDate, array $holidays, array $nonBusinessDays ,array $specialBusinessDay) {
        $this->d = $startDate;
        $this->holidays=[];
        foreach($holidays as $holiday){
            array_push($this->holidays,new DateTime($holiday));
        }
        $this->nonBusinessDays = $nonBusinessDays;
        $this->specialBusinessDay = $specialBusinessDay;
    }

    public function addBusinessDays($howManyDays) {
        $i = 0;
        while ($i < $howManyDays) {
            $this->d = $this->d+1*24*60*60;
            if ($this->isBusinessDay($this->d)) {
                $i++;
            }
        }
    }

    public function getDate() {
        return $this->d;
    }

    private function isBusinessDay(int $d) {
        if(in_array(date('Y-m-d',$d) , $this->specialBusinessDay)) return true; //判断当前日期是否是因法定节假日调休而上班的周末,这种情况也算工作日

        if (in_array((int)date('w',$d), $this->nonBusinessDays)) {
            return false; //当前日期是周末
        }

        foreach ($this->holidays as $day) {
            if (date('Y-m-d',$d) == $day->format('Y-m-d')) {
                return false; //当前日期是法定节假日
            }
        }

        return true;
    }

}

$holidays=["2017-01-27","2017-01-28","2017-01-29","2017-01-30","2017-01-31","2017-02-01","2017-02-02"];//从聚合数据接口获得
$specialBusinessDay=["2017-01-22"];//因法定节假日调休而上班的周末,这种情况也算工作日.因为这种情况少,可以通过手动配置
$calculator = new BusinessDaysCalculator(
    time(), //当前时间
    $holidays,
    [BusinessDaysCalculator::SATURDAY, BusinessDaysCalculator::SUNDAY],
    $specialBusinessDay
);

$calculator->addBusinessDays(120); // 120个工作日后的时间

$afterBusinessDay=$calculator->getDate();
echo date('Y-m-d H:i:s',$afterBusinessDay);

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-02 10:36:11  更:2021-08-02 10:37:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 16:38:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码