栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

计算工作日

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

计算工作日

这是PHP手册中date()函数页面上用户注释的函数。它是对注释中早期功能的改进,增加了对leap年的支持。

输入开始和结束日期,以及可能在其间的任何假日的数组,它以整数形式返回工作日:

<?php//The function returns the no. of business days between two dates and it skips the holidaysfunction getWorkingDays($startDate,$endDate,$holidays){    // do strtotime calculations just once    $endDate = strtotime($endDate);    $startDate = strtotime($startDate);    //The total number of days between the two dates. We compute the no. of seconds and divide it to 60*60*24    //We add one to inlude both dates in the interval.    $days = ($endDate - $startDate) / 86400 + 1;    $no_full_weeks = floor($days / 7);    $no_remaining_days = fmod($days, 7);    //It will return 1 if it's Monday,.. ,7 for Sunday    $the_first_day_of_week = date("N", $startDate);    $the_last_day_of_week = date("N", $endDate);    //---->The two can be equal in leap years when february has 29 days, the equal sign is added here    //In the first case the whole interval is within a week, in the second case the interval falls in two weeks.    if ($the_first_day_of_week <= $the_last_day_of_week) {        if ($the_first_day_of_week <= 6 && 6 <= $the_last_day_of_week) $no_remaining_days--;        if ($the_first_day_of_week <= 7 && 7 <= $the_last_day_of_week) $no_remaining_days--;    }    else {        // (edit by Tokes to fix an edge case where the start day was a Sunday        // and the end day was NOT a Saturday)        // the day of the week for start is later than the day of the week for end        if ($the_first_day_of_week == 7) { // if the start date is a Sunday, then we definitely subtract 1 day $no_remaining_days--; if ($the_last_day_of_week == 6) {     // if the end date is a Saturday, then we subtract another day     $no_remaining_days--; }        }        else { // the start date was a Saturday (or earlier), and the end date was (Mon..Fri) // so we skip an entire weekend and subtract 2 days $no_remaining_days -= 2;        }    }    //The no. of business days is: (number of weeks between the two dates) * (5 working days) + the remainder//---->february in none leap years gave a remainder of 0 but still calculated weekends between first and last day, this is one way to fix it   $workingDays = $no_full_weeks * 5;    if ($no_remaining_days > 0 )    {      $workingDays += $no_remaining_days;    }    //We subtract the holidays    foreach($holidays as $holiday){        $time_stamp=strtotime($holiday);        //If the holiday doesn't fall in weekend        if ($startDate <= $time_stamp && $time_stamp <= $endDate && date("N",$time_stamp) != 6 && date("N",$time_stamp) != 7) $workingDays--;    }    return $workingDays;}//Example:$holidays=array("2008-12-25","2008-12-26","2009-01-01");echo getWorkingDays("2008-12-22","2009-01-02",$holidays)// => will return 7?>


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/442919.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号