计算天数,不包括周末

时间:2020-07-08 09:17:01

标签: php

我有一个网站,可以在其中计算订单的交货日期。所以我们的工作日从1到30开始,所以主要情况是,

  • 如果有人在星期六或星期日下订单,则日期应从星期一开始(工作日为星期一至星期五)
  • 如果某人在18.00之前下订单,那么日期应该从今天开始,否则应该从第二天开始..例如:如果该订单是在2020-07-07的18.00之前下订单,则第7天是开始日期否则第八
  • 如果交货日期为星期日,则应改为星期一

下面是我的代码,问题在于它仅在某些日子有效。大多数情况下,这会增加一天的时间。

$thedays = array('1','2','3','4','5');

foreach ($thedays as $days) {

if (date('H') > 17) {
   $cutoff = 1;

} else {
     $cutoff = 0;
}


$extra_days = 0;

//is today a weekend
if(date('l', strtotime(date('Y-m-d'))) == 'Sunday')  {
    
    $extra_days = 1;
}

if(date('l', strtotime(date('Y-m-d'))) == 'Saturday')  {
    
    $extra_days = 2;
}

$total1= $cutoff+$extra_days+$days;

$date_1 = date('Y-m-d', strtotime("+".$total1." day"));

 $date = date('Y-m-d');
 $date2 = $date_1;

$period = new DatePeriod(
    new DateTime($date),
    new DateInterval('P1D'),
    new DateTime($date2)
);


$q = 0;
$d= 0;
foreach ($period as $key => $value) {
    $d++;
    if ($value->format('N') > 5) {
       $q++;
       
    }  
}


$total_days_with_weekends = ($days+$q+$extra_days);

$date_1 = date('Y-m-d', strtotime("+".$total_days_with_weekends." day"));

if(date('l', strtotime($date_1)) == 'Saturday')  {
 
    $date_1 = date('Y-m-d', strtotime("-1 day"));
}


if(date('l', strtotime($date_1)) == 'Sunday')  {
    $days= $days+1;
    
    $date_1 = date('Y-m-d', strtotime("+".$days." day"));
    
}

echo $data_1;

}

有人可以建议这样做的最佳方法吗?

谢谢

1 个答案:

答案 0 :(得分:0)

考虑周六也是无效的交货日期,我得到了如下信息:

> let format = "%0.4ef";;
val format : string = "%0.4ef"

> withFormat format 123.4567899112233445566;;
val it : string = "1.2346e+002f"

可以用工作日简化:

function getDeliveryDate(DateTime $orderDate, int $days): DateTime {
  $deliveryDate = clone $orderDate;
  $remainingDays = $days;

  // if it is after 18:00 we skip current day
  if ($orderDate->format('H') >= 18) {
    $deliveryDate->add(new DateInterval('P1D'));
  }

  // we process days until we reach specified amount
  while ($remainingDays > 0) {
    $deliveryDate->add(new DateInterval('P1D'));

    // we skip saturday and sunday
    if (!in_array($deliveryDate->format('D'), ['Sat', 'Sun'])) {
      $remainingDays--;
    }
  }

  return $deliveryDate;
}

测试:

function getDeliveryDate(DateTime $orderDate, int $days): DateTime {
  $deliveryDate = clone $orderDate;

  if ($orderDate->format('H') >= 18) {
    $days++;
  } 
  
  return $deliveryDate->modify('+'.$days.' weekday');
}

测试输出:

function check(string $orderDate, int $days, string $expectedDeliveryDate) {
  $deliveryDate = getDeliveryDate(new DateTime($orderDate), $days);

  if ($deliveryDate->format('Y-m-d') !== $expectedDeliveryDate) {
    echo 'Order date: '.$orderDate.', days: '.$days.', expected: '.$expectedDeliveryDate.' got: '.$deliveryDate->format('Y-m-d').PHP_EOL;
  } else {
    echo 'Order date: '.$orderDate.', days: '.$days.', expected: '.$expectedDeliveryDate.' - OK'.PHP_EOL;
  }
}

check('2020-07-08 12:00', 1, '2020-07-09');
check('2020-07-08 12:00', 2, '2020-07-10');
check('2020-07-08 18:00', 1, '2020-07-10');
check('2020-07-08 12:00', 6, '2020-07-16');
check('2020-07-08 12:00', 5, '2020-07-15');
相关问题