2011-10-19 9 views
0

私は2つの出荷ゾーンA & Bを持っています。ゾーンAの注文は毎週月曜日、水曜日の&金曜日に配信され、ゾーンBは火曜日、木曜日、土曜日に配信されます。各注文について、配送日はゾーンに応じてNEXT AVAILABLE日に予定されています。月曜日に商品を注文すると、商品はBゾーンの火曜日とAゾーンの水曜日に配送されます。PHPこの例で次の日付を取得するにはどうすればよいですか?

BUT:ご注文の場合はが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; 
?> 

注:私は、私は別の$のdays_plus値で再びそれを呼び出すことができるように(X日増)関数findNextDay($のdays_plus、$日、$のLAST_DAY、$ゾーン)にループを変換してみました私はそれを働かせることができませんでした。興味のある人のためhere is the modified version

答えて

0

これは私がやる方法です。

NOTE
私は、ビジネス・ルールのすべてを処理するための最良の方法を考え出すまでの時間の全体の多くを与えていないが、私のすべてのテストが動作するように見えました。

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

ありがとう、完璧です! – bikey77

関連する問題