2015-08-09 107 views
-1

我想通过使用自定义关闭日计算两个日期之间的总工作日。我在星期一,星期六和星期日插入表格。但是,当我从2015-07-26开始日期和2015-08-26结束日期计算时,结果是正确的。但是,如果开始日期2015-08-01和结束日期2015-08-31,结果不正确。两个日期之间的总工作日与自定义日期

我该怎么做?

这里是我的代码

<?php 
include 'connect.php'; 
error_reporting(E_ALL^E_NOTICE); 
if (isset($_POST['startdate']) && isset($_POST['enddate'])) 
{ 
     $startdate=$_POST['startdate']; 
     $enddate=$_POST['enddate']; 
     $no = 0; 

    $daysdiff = floor(((strtotime($enddate) -strtotime($startdate))/86400)+1); 
     echo "total day is".$daysdiff; 

    $startdate = new DateTime($startdate); 
    $enddate= new DateTime($enddate); 
    $interval = DateInterval::createFromDateString('1 day'); 
    $period = new DatePeriod($startdate, $interval, $enddate); 

    $res=mysql_query("SELECT * From working_day") or die(mysql_error()); 
    while ($row = mysql_fetch_assoc($res)) 
    { 
     $id=$row['id']; 
     $name_value=$row['off_days']; 


     foreach ($period as $dt) 
     { 
      if (($dt->format('N')== $id)) 
      { 
      $no++; 
      //$result=$daysdiff-$no; 
      } 
     } 
     $result=$daysdiff-$no;      

    } 
    echo "<input class='form-control' type='text' name='working_day' value='$result' />"; 

} 
?> 

回答

1

我使用,我相信我是从这个网站很久以前的事了计算时间关闭在我的web应用程序的员工的功能。下面是完整的功能,在这里我也考虑到自定义假日从一个名为表“holiday_dates”:

function countWorkingDays($startDate,$endDate) 
{ 
    $pdoCore = Core::getInstance(); 

    // Build the holiday array 
    $holidays_q = $pdoCore->dbh->prepare("SELECT holidayDate FROM holiday_dates"); 
    $holidays_q->execute(); 

    while($holidays_a = $holidays_q->fetch(PDO::FETCH_ASSOC)) 
    { 
     $holidays[] = $holidays_a['holidayDate']; 
    } 

    // 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 and 6 <= $the_last_day_of_week) 
     { 
      $no_remaining_days--; 
     } 
     if($the_first_day_of_week <= 7 and 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 and $time_stamp <= $endDate and date("N",$time_stamp) != 6 and date("N",$time_stamp) != 7) 
     { 
      $workingDays--; 
     } 
    } 

    return $workingDays; 
} 

为您的使用情况下,我会说注意这行:

if($startDate <= $time_stamp and $time_stamp <= $endDate and date("N",$time_stamp) != 6 and date("N",$time_stamp) != 7) 

并在周一加入:

and date("N",$time_stamp) != 1 
相关问题