PHP - 下一个工作日,但周一至周五13:00至周日24:00跳过

时间:2018-04-19 11:07:53

标签: php date

以下显示从今天起的下一个工作日,跳过在数组中声明的银行假日。

function get_next_workday() { 
  $bankhols = array(
    '25-Dec-2018',
    '26-Dec-2018',
  ); 
  $nextdays = array(strtotime('+1 day'), strtotime('+2 days'), strtotime('+3 days'), strtotime('+4 days'), strtotime('+5 days')); 
  for ($i = 0; $i < count($nextdays); $i++) { 
    $daynum = (int) date('w', $nextdays[$i]); 
    $daytext = date('d-M-Y', $nextdays[$i]); 
    if (($daynum > 0) && ($daynum < 6) && (!in_array($daytext, $bankhols))) { 
      return $nextdays[$i]; 
    } 
  }
}

echo date('l, jS F', get_next_workday());

我正在努力获得第二天截止时间为下午1点的电子商务网站的投放日。如果在截止时间之后,有人可以帮我修改这个以跳到下一个工作日吗?

1 个答案:

答案 0 :(得分:1)

你需要找到一个&#34;开始&#34;日期要增加,所以而不是计算交货日期,计算出当前日期,查看它适合你的规则,然后增加&#34;开始&#34;日期,直到它通过你的规则。

然后你可以找出你的交货日期:

function get_next_workday() {
  $bankhols = array('25-Dec-2018', '26-Dec-2018');
  $increment_days = 5;

  $dayincrease  = 1; // Used if today happens to fall on a weekend / fri > 1pm
  $start_date   = date('d-M-Y', strtotime('now')); // Assume the "start" date is now
  $nownum       = (int)date('w', strtotime('now'));

  // Continue to increment the "start" date if it's a Fri > 1pm, Sat, or Sun
  while ( in_array($nownum, array(6,0)) OR ($nownum===5 AND (int)date('H')>13) ) {
    $newdate      = strtotime('+'.$dayincrease.' day');
    $nownum       = date('w', $newdate);
    $start_date   = date('d-M-Y', $newdate);
    $dayincrease++;
  }

  // Now we have a "start" date to work from
  // (either now, or, the following monday),
  // we can now find the delivery dates

  for ($i=1; $i<=$increment_days; $i++) {
    // Increment the Delivery Date another day (from our "start" date)
    $delivery   = strtotime($start_date.'+'.$i.' day');
    // As long as it's a Mon, Tue, Wed, Thur, Fri, and Not Bank Holidays, it's a delivery date!
    if (in_array((int)date('w', $delivery), array(1,2,3,4,5)) AND !in_array(date('d-M-Y', $delivery), $bankhols)) return $delivery;
  }
}

echo date('l, jS F', get_next_workday());

第一个&#34;而&#34;循环在周日午夜检查之前的星期五下午1点之后执行,如果当前时间在该窗口内,它会持续增加一天,直到窗口掉出来。

然后可以使用该开始日期找到交货日期。

希望这有帮助。