如何在PHP中编写一个函数,返回没有星期六,星期日和节假日的交付日期?
例如:相同产品3天交货,其他产品5天交货。
如果我今天执行命令,我将在3天内收到我的命令,没有星期六,星期日和节假日。
如果我现在对产品"3j"执行"29/12/2011"的命令,我将在"4/1/2011"收到您的命令
在数据库中,我只知道每种产品的日销售额。
例如:
prod1: 3day
prod2: 5day
prod3: 7day
我试图做一个函数,但失败了。
以下代码(稍作修改)用于我的一个站点的生产环境:
// $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--;
}
}
看一下:
http://php.net/manual/en/function.localtime.php这将根据您提供的时间返回一个工作日。如果你现在的时间是X,你需要在2天内交货,你会做localtime(X + 2*24*3600)
。生成的结构体将包含工作日,您可以使用它根据需要向前或向后移动时间。