首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在给定的工作日列表中找到最早即将到来的日期?

如何在给定的工作日列表中找到最早即将到来的日期?
EN

Stack Overflow用户
提问于 2011-09-08 18:27:00
回答 3查看 858关注 0票数 1

PHP中的日期对我来说是一场噩梦,所以请帮助我…我想通知客户他们的订单将会在哪一天送达。它是这样工作的:

我有两个发货区,A区和B区。A区的订单每周一、周三和周五发货,而B区的订单是周二、周四和周六。对于每个订单,根据区域的不同,发货日期安排在下一个可用日期。请考虑,如果某人在周一下单,货物将在下一个可用日期发货,即B区为周二,A区为周三。

如何计算下一个可用交货日期并通知客户?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-08 22:05:43

试试这个:

代码语言:javascript
运行
复制
// 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);
票数 1
EN

Stack Overflow用户

发布于 2011-09-08 18:36:57

这肯定不是最快或最聪明的答案,但阅读代码将是一种乐趣。

假设我们在A区发货:

代码语言:javascript
运行
复制
$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中可用的relative date formats,这就是“下周一”魔术发生的地方。有关可以使用$shippingDate执行哪些操作的信息,请参阅有关DateTime类的文档。

更新

为了完整,这里是一个更老式的版本,它不需要PHP 5.3,也应该更快(尽管速度在这里实际上是无关紧要的)。我不太喜欢它,因为要验证它是否正常工作并不容易。与上面的版本相比,这个版本在我第一次写它的时候有一个bug。简单就是好的。

代码语言:javascript
运行
复制
$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');

票数 3
EN

Stack Overflow用户

发布于 2011-09-08 18:40:53

代码语言:javascript
运行
复制
$timestamp = strtotime('next Monday');
$date      = date('Y-m-d', $timestamp);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7346555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档