Calculate business days

后端 未结 30 1819
猫巷女王i
猫巷女王i 2020-11-22 05:16

I need a method for adding \"business days\" in PHP. For example, Friday 12/5 + 3 business days = Wednesday 12/10.

At a minimum I need the code to understand weekend

相关标签:
30条回答
  • 2020-11-22 05:51
    <?php 
    function AddWorkDays(){
    $i = 0;
    $d = 5; // Number of days to add
    
        while($i <= $d) {
        $i++;
            if(date('N', mktime(0, 0, 0, date(m), date(d)+$i, date(Y))) < 5) {
                $d++;
            }
        }
        return date(Y).','.date(m).','.(date(d)+$d);
    }
    ?>
    
    0 讨论(0)
  • 2020-11-22 05:52

    function get_business_days_forward_from_date($num_days, $start_date='', $rtn_fmt='Y-m-d') {

    // $start_date will default to today    
    
    if ($start_date=='') { $start_date = date("Y-m-d"); }
    
    $business_day_ct = 0;
    
    $max_days = 10000 + $num_days;  // to avoid any possibility of an infinite loop
    
    
    // define holidays, this currently only goes to 2012 because, well, you know... ;-)
    // if the world is still here after that, you can find more at
    // http://www.opm.gov/Operating_Status_Schedules/fedhol/2013.asp
    // always add holidays in order, because the iteration will stop when the holiday is > date being tested
    
    $fed_holidays=array(
        "2010-01-01",
        "2010-01-18",
        "2010-02-15",
        "2010-05-31",
        "2010-07-05",
        "2010-09-06",
        "2010-10-11",
        "2010-11-11",
        "2010-11-25",
        "2010-12-24",
    
        "2010-12-31",
        "2011-01-17",
        "2011-02-21",
        "2011-05-30",
        "2011-07-04",
        "2011-09-05",
        "2011-10-10",
        "2011-11-11",
        "2011-11-24",
        "2011-12-26",
    
        "2012-01-02",
        "2012-01-16",
        "2012-02-20",
        "2012-05-28",
        "2012-07-04",
        "2012-09-03",
        "2012-10-08",
        "2012-11-12",
        "2012-11-22",
        "2012-12-25",
        );
    
    $curr_date_ymd = date('Y-m-d', strtotime($start_date));    
    
    for ($x=1;$x<$max_days;$x++)
    {
        if (intval($num_days)==intval($business_day_ct)) { return(date($rtn_fmt, strtotime($curr_date_ymd))); }  // date found - return
    
        // get next day to check
    
        $curr_date_ymd = date('Y-m-d', (strtotime($start_date)+($x * 86400)));   // add 1 day to the current date
    
        $is_business_day = 1;
    
        // check if this is a weekend   1 (for Monday) through 7 (for Sunday)
    
        if ( intval(date("N",strtotime($curr_date_ymd))) > 5) { $is_business_day = 0; }
    
        //check for holiday
        foreach($fed_holidays as $holiday)
        {
            if (strtotime($holiday)==strtotime($curr_date_ymd))  // holiday found
            {
                $is_business_day = 0;
                break 1;
            }
    
            if (strtotime($holiday)>strtotime($curr_date_ymd)) { break 1; }  // past date, stop searching (always add holidays in order)
    
    
        }
    
        $business_day_ct = $business_day_ct + $is_business_day;  // increment if this is a business day
    
    } 
    
    // if we get here, you are hosed
    return ("ERROR");
    

    }

    0 讨论(0)
  • 2020-11-22 05:52

    Just finished writing an API that can be used to manipulate business days (none of these solutions quite worked for my situation :-); linking to it here in case anyone else finds it useful.

    ~ Nate

    PHP Class to Calculate Business Days

    0 讨论(0)
  • 2020-11-22 05:54

    There are some args for the date() function that should help. If you check date("w") it will give you a number for the day of the week, from 0 for Sunday through 6 for Saturday. So.. maybe something like..

    $busDays = 3;
    $day = date("w");
    if( $day > 2 && $day <= 5 ) { /* if between Wed and Fri */
      $day += 2; /* add 2 more days for weekend */
    }
    $day += $busDays;
    

    This is just a rough example of one possibility..

    0 讨论(0)
  • 2020-11-22 05:55
    date_default_timezone_set('America/New_York');
    
    
    /** Given a number days out, what day is that when counting by 'business' days
      * get the next business day. by default it looks for next business day
      * ie calling  $date = get_next_busines_day(); on monday will return tuesday
      *             $date = get_next_busines_day(2); on monday will return wednesday
      *             $date = get_next_busines_day(2); on friday will return tuesday
      *
      * @param $number_of_business_days (integer)       how many business days out do you want
      * @param $start_date (string)                     strtotime parseable time value
      * @param $ignore_holidays (boolean)               true/false to ignore holidays
      * @param $return_format (string)                  as specified in php.net/date
     */
    function get_next_business_day($number_of_business_days=1,$start_date='today',$ignore_holidays=false,$return_format='m/d/y') {
    
        // get the start date as a string to time
        $result = strtotime($start_date);
    
        // now keep adding to today's date until number of business days is 0 and we land on a business day
        while ($number_of_business_days > 0) {
            // add one day to the start date
            $result = strtotime(date('Y-m-d',$result) . " + 1 day");
    
            // this day counts if it's a weekend and not a holiday, or if we choose to ignore holidays
            if (is_weekday(date('Y-m-d',$result)) && (!(is_holiday(date('Y-m-d',$result))) || $ignore_holidays) ) 
                $number_of_business_days--;
    
        }
    
        // when my $number of business days is exausted I have my final date
    
        return(date($return_format,$result));
    }
    
        function is_weekend($date) {
        // return if this is a weekend date or not.
        return (date('N', strtotime($date)) >= 6);
    }
    
    function is_weekday($date) {
        // return if this is a weekend date or not.
        return (date('N', strtotime($date)) < 6);
    }
    
    function is_holiday($date) {
        // return if this is a holiday or not.
    
        // what are my holidays for this year
        $holidays = array("New Year's Day 2011" => "12/31/10",
                            "Good Friday" => "04/06/12",
                            "Memorial Day" => "05/28/12",
                            "Independence Day" => "07/04/12",
                            "Floating Holiday" => "12/31/12",
                            "Labor Day" => "09/03/12",
                            "Thanksgiving Day" => "11/22/12",
                            "Day After Thanksgiving Day" => "11/23/12",
                            "Christmas Eve" => "12/24/12",
                            "Christmas Day" => "12/25/12",
                            "New Year's Day 2012" => "01/02/12",
                            "New Year's Day 2013" => "01/01/13"
                            );
    
        return(in_array(date('m/d/y', strtotime($date)),$holidays));
    }
    
    
    print get_next_business_day(1) . "\n";
    
    0 讨论(0)
  • 2020-11-22 05:56

    The add_business_days has a small bug. Try the following with the existing function and the output will be a Saturday.

    Startdate = Friday Business days to add = 1 Holidays array = Add date for the following Monday.

    I have fixed that in my function below.

    function add_business_days($startdate, $buisnessdays, $holidays = array(), $dateformat = 'Y-m-d'){
    $i= 1;
    $dayx= strtotime($startdate);
    $buisnessdays= ceil($buisnessdays);
    
    while($i < $buisnessdays)
    {
        $day= date('N',$dayx);
    
        $date= date('Y-m-d',$dayx);
        if($day < 6 && !in_array($date,$holidays))
            $i++;
    
        $dayx= strtotime($date.' +1 day');
    }
    
    ## If the calculated day falls on a weekend or is a holiday, then add days to the next business day
    $day= date('N',$dayx);
    $date= date('Y-m-d',$dayx);
    
    while($day >= 6 || in_array($date,$holidays))
    {
        $dayx= strtotime($date.' +1 day');
        $day= date('N',$dayx);
        $date= date('Y-m-d',$dayx);
    }
    
    return date($dateformat, $dayx);}
    
    0 讨论(0)
提交回复
热议问题