PHP, как я могу получить следующую дату в этом примере?
Вопрос
У меня есть 2 зоны доставки, A & B Заказы на зону A доставляются каждый понедельник, среду и пятницу, тогда как зона B находится во вторник, четверг, суббота. Для каждого заказа день доставки назначен на следующий доступный день, в зависимости от зоны. Пожалуйста, учтите, что если кто -то разместит заказ в понедельник, то товары будут доставлены в следующую доступную дату, это будет во вторник для зоны B и среды для зоны A.
Но: если заказ размещен Позже 18:00 (18:00) и зона клиента находится в зоне доставки завтрашнего дня, тогда мы должны продвинуть дату доставки в следующий доступный день Для этой зоны (потому что заказ еще не будет готов, слишком короткое уведомление).
Вот код, и он работает нормально, за исключением последней части, где мне нужно проверить время, получить регулярную дату доставки и сравнить его с датой завтрашнего дня.
<?
$date = array(date("d"), date("m"), date("Y"));
$zones = array("A" => array(1 => "Monday",
3 => "Wednesday",
5 => "Friday")
,"B" => array(2 => "Tuesday",
4 => "Thursday",
6 => "Saturday"));
$found = false;
$days_plus = 1; // always begin from next day
// Retrieve last day from the zone
end($zones[$zone]); //Friday or Saturday
$last_day = key($zones[$zone]); //5 or 6
do {
$mk = mktime(0, 0, 0, $date[1], ($date[0] + $days_plus), $date[2]);
$week = date("w", $mk); // current day of week
if ($week <= $last_day) // if weekday not passed last day of zone
{
if (!isset($zones[$zone][$week]))
{
$days_plus++;
}
else
{
$found = true;
$day = $last_day;
}
}
else
{
$days_plus++;
}
} while (!$found);
$deliverydate = date("d/m/Y", $mk); // regular delivery date
$tomorrow = date('d/m/Y', strtotime('tomorrow'));
//Now, check if order is placed after 6pm
if ((date("d/m/Y", $mk)==$tomorrow) && (date('G') > 18)) {
// HERE'S my problem, how do I advance the
//delivery date to next day in the same zone?
}
echo $deliverydate;
?>
Примечание: я попытался преобразовать цикл в функцию FindNextDay ($ DASH_PLUS, $ DATE, $ LAST_DAY, $ Zone), чтобы я мог позвонить ему снова с другим значением $ DAY_PLUS (увеличено на x дней), но я не мог его получить работать. Для всех заинтересованных Вот модифицированная версия
Решение
Вот как я бы это сделал.
ПРИМЕЧАНИЕ
Я не давал много времени, чтобы выяснить, как лучше всего справиться со всеми деловыми правилами, но все мои тесты, казалось, работали.
<?php
error_reporting(E_ALL);
ini_set('display_errors','On');
date_default_timezone_set('America/Los_Angeles');
$zones = array('A', 'B');
$zone_key = array_rand($zones);
$zone = $zones[$zone_key];
function getDeliveryDate($zone, $d = NULL, $time = NULL) {
if ($time === NULL)
$time = date('G');
if ($d === NULL)
$now = strtotime('now');
else
$now = strtotime($d);
$d = date('w', $now);
$days = 1;
if ($zone == 'A') {
if ($d % 2) $days += 1;
else if ($time > 18) $days += 2;
if ($d + $days == 7) $days += 1;
elseif ($d + $days > 7) $days -= 1;
} else {
if (! ($d % 2)) $days += 1;
else if ($time > 18) $days += 2;
if ($d + $days > 7) $days += 1;
}
$delivery_date = strtotime("+${days}days", $now);
echo "For zone $zone, schedule on " . date('D', $now) . ", at $time, will deliver on " . date('m-d-Y', $delivery_date) . " which is a " . date('D', $delivery_date) . "\n";
}
$days = array('10/16/2011', '10/17/2011', '10/18/2011', '10/19/2011', '10/20/2011', '10/21/2011', '10/22/2011');
$times = array(17, 20);
foreach ($zones as $zone) {
foreach ($days as $d) {
foreach ($times as $t) {
getDeliveryDate($zone, $d, $t);
}
}
}