无周六,周日和节假日返回交货日期的功能

时间:2011-12-29 15:01:50

标签: php

如何在PHP中编写一个函数,在没有星期六,星期日和节假日的情况下返回交付日期?

例如:对于同一产品,5天内其他人的产品交付时间为3天。

如果我今天做命令,我将在3天内收到我的命令,没有星期六,星期日和节假日。

如果我现在执行“29/12/2011”的产品“3j”,我将在“4/1/2011”收到您的命令

在数据库中,我知道每种类型产品的日期是多少。

例如:

prod1: 3day  
prod2: 5day  
prod3: 7day   

我试图做一个功能但失败了。

3 个答案:

答案 0 :(得分:2)

此代码(略有改动)用于我的某个网站的制作:

// $dt = date of shipping, $numdays = expected number of days in transit
function realDeliveryDate($dt, $numdays)
{
    $holidays = array("05/30/2011","07/04/2011","09/05/2011","11/24/2011","11/25/2011","12/25/2011","12/31/2011","01/01/2012","05/28/2012","07/04/2012","09/03/2012","11/22/2012","11/23/2012","12/25/2012");
    $checkday = strtotime($dt." +".$numdays." days");
    // check if it's a holiday
    while(in_array(date("m/d/Y",$checkday), $holidays)) {
        $checkday = strtotime(date("m/d/Y",$checkday)." +1 day");
    }
    // make sure it's not Saturday
    if (date("w",$checkday) == 6) {
        $checkday = strtotime(date("m/d/Y",$checkday)." +2 days");
    }
    // make sure it's not Sunday
    if (date("w",$checkday) == 0) {
        $checkday = strtotime(date("m/d/Y",$checkday)." +1 day");
    }
    // make sure it's not another holiday
    while(in_array(date("m/d/Y",$checkday), $holidays)) {
        $checkday = strtotime(date("m/d/Y",$checkday)." +1 day");
    }
    return $checkday;
}

答案 1 :(得分:1)

这是一个非常复杂的主题,你无法通过一个简单的功能来解决这个问题。你在谈论工作日计算策略,它们涉及很多想法。

如果您只想处理工作日而非工作时间,那么它会稍微容易一些。

第一步是创建一个工作日数组或一系列非工作日。例如:

//Build the days based of weekends
$nonWorkingDays = array();
foreach($iDate = 0; $iDate < 365; $iDate++){
    $date = strtotime('today +'.$iDate.' day');
    if(date('w', $date) == 0 || date('w', $date) == 6){
        $nonWorkingDays = date('Y-m-d', $date);
    }
}

//Add the holidays
$nonWorkingDays[] = '2011-12-25';
$nonWorkingDays[] = '2012-01-01';

//Determine the date of delivery
$daysToDelivery = 6;
$deliveryDate = time();
while($daysToDelivery > 0){
    $deliveryDate = time() + (24*60*60);
    if(!in_array(date('Y-m-d', $deliveryDate), $nonWorkingDays)){
        $daysToDelivery--;
    }
}

答案 2 :(得分:0)

看看:

http://php.net/manual/en/function.localtime.php

这将根据您提供的时间返回工作日。因此,如果您当前的时间是X而且您需要在2天内交付,那么您将localtime(X + 2*24*3600)。生成的结构将包含工作日,您可以根据需要使用它来向前或向后移动时间。