#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:
Начиная с даты с текущим временем, вы должны изменить дату на следующий день, если
- Время> = 4 вечера или
- День — воскресенье или
- Этот день находится в списке не отправленных товаров
Список, не являющийся отправителем, задается в виде массива:
$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. Привет, если я хочу добавить субботу и воскресенье? Спасибо