PHP在本例中如何获取下一个日期?

PHP在本例中如何获取下一个日期?,php,date,mktime,Php,Date,Mktime,我有两个装运区,A区和B区。A区的订单在每周一、周三和周五送达,而B区在周二、周四和周六送达。对于每个订单,交货日期安排在下一个可用日期,具体取决于区域。请考虑,如果有人在星期一下订单,货物将在下一个有效日期交付,这将是B区和星期三的A区的星期二。 但是:如果订单晚于18:00(下午6点)下,且客户所在区域位于明天的交货区域内,则我们必须将该区域的交货日期提前到下一个可用日期(因为订单还没有准备好,通知太短) 这是代码,它运行良好,除了最后一部分,我需要检查时间,获得正常的交货日期,并将其与明天

我有两个装运区,A区和B区。A区的订单在每周一、周三和周五送达,而B区在周二、周四和周六送达。对于每个订单,交货日期安排在下一个可用日期,具体取决于区域。请考虑,如果有人在星期一下订单,货物将在下一个有效日期交付,这将是B区和星期三的A区的星期二。 但是:如果订单晚于18:00(下午6点)下,且客户所在区域位于明天的交货区域内,则我们必须将该区域的交货日期提前到下一个可用日期(因为订单还没有准备好,通知太短)

这是代码,它运行良好,除了最后一部分,我需要检查时间,获得正常的交货日期,并将其与明天的日期进行比较

<? 
$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; 
?>

我会这样做

注意
我没有花太多时间来找出处理所有业务规则的最佳方法,但我的所有测试似乎都有效

<?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);
        }
    }
}