Как отобразить следующую доступную дату доставки до 16:00 в php

#php #date #e-commerce #shipping

#php #Дата #электронная коммерция

Вопрос:

Я использую php и mysqli для своего проекта.

Мой вопрос касается расчета следующих доступных дат доставки.

На моей странице оформления заказа на моем веб-сайте отображается следующая доступная дата доставки в соответствии со следующими правилами:

Я могу отправить с понедельника по субботу до 4 вечера.

У меня есть таблица «cantship», содержащая даты в формате d / m / Y, которые я не могу отправить, потому что я на работе.

Таким образом, отображаемая следующая доступная дата доставки должна быть с понедельника по субботу, если только ее дата, прошедшая с 4:00 или сегодняшняя, не совпадает с датой в таблице поставок.

Итак, что мне нужно показать:

Если время сейчас до 16:00, а сегодня понедельник-суббота, я могу отправить сегодня, чтобы показать сегодняшнюю дату (если сегодняшняя дата не указана в таблице поставок)

Если время сейчас после 4 вечера, я не могу отправить сегодня, поэтому следующей датой доставки должен быть пн-сб, которого нет в таблице поставок.

Если рассчитанная дата доставки указана в таблице доставки, я не могу отправить в этот день, поэтому следующая дата доставки должна быть на следующий день между пн-сб, которого нет в таблице доставки.

Вот мой код до сих пор: Извините, он грязный.

 <?php
function nextshipdate ($db)
{
// ========================================================================
// find next available date for despatch
// ========================================================================

$i = 0; 
 
$cutoff = strtotime('today 16:00');
$today1 = strtotime('today');

if ($cutoff >strtotime($today1 ))
  {
    echo "<p>its after 4pm!<p>";
    $i = 1;
  }


$tmpDate =date('d-m-Y H:i:s');
$nextBusinessDay = date('d-m-Y ', strtotime($tmpDate . '  ' . $i . ' Weekday'));
$nextavail= date('d-m-Y H:i:s', strtotime($tmpDate . '  ' . $i . ' Weekday'));
 
$dontuse = array();
$getbiz   = $db->get_results("SELECT * from   cantship      ");
$nowcheck = new DateTime();


// =======================================================
// remove past dates from cantship table
// =======================================================
foreach ($getbiz as $inpast)
{
  if (strtotime($inpast->csdate)<= time()) 
    {
      //echo  $inpast->csdate." has passed!<p>";
      $removeold = $db->query("DELETE from  cantship where   csdate='". $inpast->csdate."'" );
    }
  
}


// =======================================================
// create array of unavailable shipping dates
// =======================================================

if ($getbiz)
  {
    foreach ($getbiz as $na)
      {
 $dontuse[]=$na->csdate;
      }

  }
 

while (in_array($nextBusinessDay, $dontuse)) 
{
    $i  ;
    $nextBusinessDay = date('d-m-Y', strtotime($tmpDate . '  ' . $i . ' Weekday'));
}


if(!empty($dontuse)) 
{
  $nbd=$nextBusinessDay;
}
else
{
$nbd=' please contact us.';
}


return $nbd;
}

// ==========================================================================================
  

Ответ №1:

Начиная с даты с текущим временем, вы должны изменить дату на следующий день, если

  1. Время> = 4 вечера или
  2. День — воскресенье или
  3. Этот день находится в списке не отправленных товаров

Список, не являющийся отправителем, задается в виде массива:

 $noShipDates = [
  '2020-10-28',
  '2020-12-24'
];
  

Логика может быть реализована в виде небольшой функции.

 function nextShipDate(array $noShipDates, $curTime = "now"){
  $date = date_create($curTime);
  $max = 1000;  //protection endless loop
  while($max--){
    if($date->format('H') >= 16 
      OR $date->format('w') == 0
      OR in_array($date->format('Y-m-d'),$noShipDates)
    ) {
        $date->modify('next Day 00:00');
      }
    else {
        return $date->format('Y-m-d');
      }
  }
  return false;
}
  

Функция возвращает строку вида ‘гггг-мм-дд’ или false для ошибки. Для целей тестирования дата может быть указана с помощью 2-го параметра.

 echo nextShipDate($noShipDates, '2020-10-27 16:01');
//2020-10-29
  

Дополнительный вопрос Февраль 2023: Как я могу добавить субботу и воскресенье?

Поменяйте местами строку

     OR $date->format('w') == 0
  

Для

     OR $date->format('N') > 5
  

Комментарии:

1. Привет, если я хочу добавить субботу и воскресенье? Спасибо