有没有人有PHP代码段来计算给定日期的下一个工作日?例如,YYYY-MM-DD需要如何转换才能找到下一个工作日?
示例:2011年4月3日(DD-MM-YYYY)下一个工作日是04.04.2011.2011年4月8日,下一个工作日是2011年4月11日.
这是包含我需要知道下一个工作日的日期的变量
$cubeTime['time'];
Run Code Online (Sandbox Code Playgroud)
变量包含:2011-04-01该片段的结果应为:2011-04-04
Dav*_*ave 88
下周工作日
这将从特定日期(不包括星期六或星期日)找到下一个工作日:
echo date('Y-m-d', strtotime('2011-04-05 +1 Weekday'));
Run Code Online (Sandbox Code Playgroud)
您当然也可以使用日期变量:
$myDate = '2011-04-05';
echo date('Y-m-d', strtotime($myDate . ' +1 Weekday'));
Run Code Online (Sandbox Code Playgroud)
更新:或者,如果您可以访问PHP的DateTime类(很可能):
$date = new DateTime('2018-01-27');
$date->modify('+7 weekday');
echo $date->format('Y-m-d');
Run Code Online (Sandbox Code Playgroud)
想要跳过假期吗?:
虽然原始海报提到"我不需要考虑假期",但如果你碰巧想要忽略假期,请记住 - "假期"只是一个你不想包括的日期的数组,并且因国家而异,地区,公司,人......等.
只需将上面的代码放入一个函数中,该函数排除/循环超出您不想包含的日期.像这样的东西:
$tmpDate = '2015-06-22';
$holidays = ['2015-07-04', '2015-10-31', '2015-12-25'];
$i = 1;
$nextBusinessDay = date('Y-m-d', strtotime($tmpDate . ' +' . $i . ' Weekday'));
while (in_array($nextBusinessDay, $holidays)) {
$i++;
$nextBusinessDay = date('Y-m-d', strtotime($tmpDate . ' +' . $i . ' Weekday'));
}
Run Code Online (Sandbox Code Playgroud)
我确定如果你愿意,上面的代码可以简化或缩短.我试着以一种易于理解的方式编写它.
小智 7
对于英国假期,您可以使用
https://www.gov.uk/bank-holidays#england-and-wales
ICS 格式数据易于解析。我的建议是...
# $date must be in YYYY-MM-DD format
# You can pass in either an array of holidays in YYYYMMDD format
# OR a URL for a .ics file containing holidays
# this defaults to the UK government holiday data for England and Wales
function addBusinessDays($date,$numDays=1,$holidays='') {
if ($holidays==='') $holidays = 'https://www.gov.uk/bank-holidays/england-and-wales.ics';
if (!is_array($holidays)) {
$ch = curl_init($holidays);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$ics = curl_exec($ch);
curl_close($ch);
$ics = explode("\n",$ics);
$ics = preg_grep('/^DTSTART;/',$ics);
$holidays = preg_replace('/^DTSTART;VALUE=DATE:(\\d{4})(\\d{2})(\\d{2}).*/s','$1-$2-$3',$ics);
}
$addDay = 0;
while ($numDays--) {
while (true) {
$addDay++;
$newDate = date('Y-m-d', strtotime("$date +$addDay Days"));
$newDayOfWeek = date('w', strtotime($newDate));
if ( $newDayOfWeek>0 && $newDayOfWeek<6 && !in_array($newDate,$holidays)) break;
}
}
return $newDate;
}
Run Code Online (Sandbox Code Playgroud)