有没有办法使用strtotime
来为日期添加工作日(周一至周五)?或者其他方法?我的目标是:
date ( 'Y-m-j' , strtotime ( '+3 working days' ) )
有没有办法使用strtotime
来为日期添加工作日(周一至周五)?或者其他方法?我的目标是:
date ( 'Y-m-j' , strtotime ( '+3 working days' ) )
如果你限制只在工作日使用,请使用字符串“weekdays”。
echo date ( 'Y-m-j' , strtotime ( '3 weekdays' ) );
这将使你提前3个工作日,所以如果今天是星期四,它会添加额外的周末时间。
来源:http://www.php.net/manual/en/datetime.formats.relative.php
strtotime()
办不到的吗? - Pekkaecho date('Y-m-d', strtotime('2011-03-27 + 5 weekdays'));
预期是4月1日,但实际得到的是4月3日。 - zerkmsdate('Y-m-d', strtotime('-1 weekdays'))
。 - Ali Hanecho date_create()->modify("+3 weekdays")->format("Y-m-d");
See:
对于 PHP >= 5.6 版本
public function addWorkingDays($date, $day)
{
if (!($date instanceof \DateTime) || is_string($date)) {
$date = new \DateTime($date);
}
if ($date instanceof \DateTime) {
$newDate = clone $date;
}
if ($day == 0) {
return $newDate;
}
$i = 1;
while ($i <= abs($day)) {
$newDate->modify(($day > 0 ? ' +' : ' -') . '1 day');
$next_day_number = $newDate->format('N');
if (!in_array($next_day_number, [6, 7])) {
$i++;
}
}
return $newDate;
}
当需要较多的工作日时,我发现这个存在缺陷。我正在寻找当前月份第一天之后 X 个工作日。
起初看起来很不错,但在添加了大于 5 个工作日后(例如 @zerkms 找到的情况),就不再适用。
对我来说,以下方法更准确。
function _getBusinessDayOfMonth( $days ) {
$time = strtotime(date("m/1/Y 00:00")); //finding # of business days after 1st of the month
$i = 0; //start with zero
while ($i < $days) { //loop through until reached the amount of weekdays
$time = strtotime("+1 day", $time); //Increase day by 1
if (date("N", $time) < 6) { //test if M-F
$i++; //Increase by 1
}
}
echo date("m/d/Y", $time);
}
function increaseWorkDay($workDayToProcess, $dayToAdd){
if($workDayToProcess >= 4 && $workDayToProcess <= 6){
$workDayToProcess= 4;
}
$workDayToProcess+= $dayToAdd;
return $workDayToProcess % 5;
}
你可以使用数组导出星期几的名称,这种方法也可以选择使用。
我用递归做了,对我有用
function add_work_days($date, $day){
if($day == 0)
return $date;
$date->add(new DateInterval('P1D'));
if(!in_array($date->format('N'), array('6', '7')))
$day--;
return add_work_days($date, $day);
}
$date = add_work_days(new DateTime(), 3);
echo $date->format('d/m/Y');
对于 PHP 版本低于 5.3 的旧版本
function AddWorkingDays($startDate, $adddays)
{
$retdate = $startDate;
$sign = "+";
if($adddays < 0){
$adddays = $adddays*-1;
$sign = "-";
}
while ($adddays > 0) {
$retdate = date ( 'Y-m-d' , strtotime ( "$retdate {$sign}1 day" ) );
$what_day = date("N", strtotime($retdate));
if ( $what_day != 6 && $what_day != 7 ) // 6 and 7 are weekend
$adddays--;
};
return $retdate;
}