Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 函数返回交货日期,不包括周六、周日和节假日_Php - Fatal编程技术网

Php 函数返回交货日期,不包括周六、周日和节假日

Php 函数返回交货日期,不包括周六、周日和节假日,php,Php,如何用PHP编写一个函数,返回没有周六、周日和节假日的交货日期 例如:对于同一产品,交货期为3天;对于其他产品,交货期为5天 如果我今天执行命令,我将在3天内收到命令,不包括周六、周日和节假日 如果我现在执行产品“3j”的“2011年12月29日”命令,我将在“2011年1月4日”收到您的命令 在数据库中,我只知道每种类型产品每天的费用是多少 例如: prod1: 3day prod2: 5day prod3: 7day 我尝试执行某个功能,但失败。请查看: 这将根据您提供的时

如何用PHP编写一个函数,返回没有周六、周日和节假日的交货日期

例如:对于同一产品,交货期为3天;对于其他产品,交货期为5天

如果我今天执行命令,我将在3天内收到命令,不包括周六、周日和节假日

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

在数据库中,我只知道每种类型产品每天的费用是多少

例如:

prod1: 3day  
prod2: 5day  
prod3: 7day   
我尝试执行某个功能,但失败。

请查看:

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

此代码(稍作修改)用于我的一个站点的生产:

// $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;
}

这是一个非常复杂的问题,用一个简单的函数是无法解决的。您正在谈论工作日计算策略,它们涉及到大量的思考

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

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

//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--;
    }
}
//基于周末构建天数
$nonWorkingDays=array();
foreach($iDate=0;$iDate<365;$iDate++){
$date=strotime('today+.$iDate.'day');
如果(日期('w',$date)==0 | |日期('w',$date)==6){
$nonWorkingDays=日期('Y-m-d',$date);
}
}
//加上假期
$nonWorkingDays[]=“2011-12-25”;
$nonWorkingDays[]=“2012-01-01”;
//确定交货日期
$daysToDelivery=6;
$deliveryDate=时间();
而($daysToDelivery>0){
$deliveryDate=time()+(24*60*60);
如果(!在数组中(日期($Y-m-d',$deliveryDate),$nonWorkingDays)){
$daysToDelivery--;
}
}

请你再详细一点好吗?这是很模糊的。请提出一个更好的问题,并尽量使用完整的句子。返回交货日期?什么送货?从数据库中获取它?基于什么?这么多问题,这么少信息…你自己试过吗?你走了多远?在请别人帮你做之前先做一些工作……在数据库中,我知道如何更改evry类型产品的日期,例如prod1:3day Prod2:5day Prod3:7Day他问的是:如何使用天数进行日期添加,但如果实际日期和添加日期之间的时间跨度包括节假日或周末,它不应该把它们算作一天。唯一失败的方法是,如果你把整个星期定为假日,那么它将在周六返回。出于我的目的,这种情况永远不会发生,所以我就不这样做了。为什么不创建一个函数(isHoliday),该函数需要1天的时间并返回true/false。@Frank:Lazness。这个函数是一个很好的例子,说明了一个乱七八糟的东西是如何保持在生产中的。如果必须的话,我会用一个循环重写函数。当我遇到这个问题时,碰巧打开了包含原始函数的文件。=)哈哈,他说你是最棒的,但是我看到绿色的对勾了吗?投票赞成吗?我说这是合适的。date delivery=现在的日期+除周六周日外的4天我的问题是我如何做到这一点,除周六周日外的4天,其余的都一样。