Как найти самую раннюю предстоящую дату, учитывая список дней недели? - PullRequest
1 голос
/ 08 сентября 2011

Даты в PHP - кошмар для меня, поэтому, пожалуйста, помогите мне, коллеги по программированию ... Я хочу уведомить клиентов о дне, когда их заказ будет доставлен.Это работает так:

У меня есть 2 зоны доставки, A и B. Заказы для зоны A доставляются каждый понедельник, среду и пятницу, тогда как зона B - во вторник, четверг, субботу.Для каждого заказа день доставки запланирован на СЛЕДУЮЩИЙ ДОСТУПНЫЙ день, в зависимости от зоны.Учтите, что если кто-то разместит заказ в понедельник, товары будут доставлены в СЛЕДУЮЩУЮ доступную дату, то есть во вторник для зоны В и среду для зоны А.

Как рассчитать СЛЕДУЮЩУЮ ДОСТУПНУЮ дату доставки иуведомить клиента?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 08 сентября 2011

Это, конечно, не будет самым быстрым или самым умным ответом, но будет приятно прочитать код.

Если предположить, что мы осуществляем доставку в зону A:

$dates = array(
    new DateTime('next monday'), // magic!
    new DateTime('next wednesday'),
    new DateTime('next friday'),
);

// Seems to work because since PHP 5.2.2 DateTime objects
// can be compared with the < and > operators    
$shippingDate = min($dates);

echo $shippingDate->format('Y-m-d');

Возможно, вы захотите взглянуть на форматы относительной даты , доступные в PHP, это та часть, где происходит волшебство «следующего понедельника».Для получения информации о том, что вы можете сделать с $shippingDate, см. Документацию по классу DateTime.

Обновление

Для полноты, вот более старая школаверсия, которая не требует PHP 5.3 и также должна быть быстрее (хотя скорость здесь практически не имеет значения).Мне это не очень нравится, потому что нелегко убедиться, что он работает правильно.В отличие от версии выше, у этой была ошибка, когда я впервые ее написал.Простое это хорошо.

$today = date('w');

// These values are from http://www.php.net/manual/en/function.date.php
$shippingDays = array(
    1, // mon
    3, // wed
    5, // fri
);

// Each of these weekdays is how many days into the future?
foreach($shippingDays as &$day) {
    $day = (7 + $day - $today) % 7;
}

// Get the earliest one, but not if it's today
// array_filter is used to remove a possible 0
$daysInFuture = min(array_filter($shippingDays));
$shippingDate = new DateTime('+'.$daysInFuture.' days');
echo $shippingDate->format('Y-m-d');

См. Это в действии .

1 голос
/ 08 сентября 2011

Попробуйте это:

// Info
$date = array(date("d"), date("m"), date("Y"));
$zone = "A";
// ------

$zones = array("A" => array(1 => "Monday",    
                            3 => "Wednesday", 
                            5 => "Friday")     

              ,"B" => array(2 => "Tuesday",    
                            4 => "Thursday",   
                            6 => "Saturday")); 

$found = false;
$days_plus = 1; // always next day

// Retrieve last day from the zone
end($zones[$zone]);
$last_day = key($zones[$zone]);

do {
    $mk = mktime(0, 0, 0, $date[1], ($date[0] + $days_plus), $date[2]);
    $week = date("w", $mk);

    // if week not passed last day of zone
    if ($week <= $last_day)
    {
        if (!isset($zones[$zone][$week]))
        {
            $days_plus++;
        }
        else
        {
            $found = true;
        }
    }
    else
    {
        $days_plus++;
    }
} while (!$found);

echo "Next date: " . date("d/m/Y - l", $mk);
0 голосов
/ 08 сентября 2011
$timestamp = strtotime('next Monday');
$date      = date('Y-m-d', $timestamp);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...