是否有人有PHP代码段来计算给定日期的下一个工作日? 例如,YYYY-MM-DD如何转换为下一个工作日?
实施例: 2011年4月3日(DD-MM-YYYY)下一个工作日是04.04.2011。 2011年4月8日,下一个工作日是2011年4月11日。
这是包含我需要知道
下一个工作日的日期的变量$cubeTime['time'];
变量包含:2011-04-01 该片段的结果应该是:2011-04-04
答案 0 :(得分:81)
下周工作日
从特定日期(不包括星期六或星期日)查找下一个工作日:
echo date('Y-m-d', strtotime('2011-04-05 +1 Weekday'));
您当然也可以使用日期变量:
$myDate = '2011-04-05';
echo date('Y-m-d', strtotime($myDate . ' +1 Weekday'));
更新或者,如果您有权访问PHP's DateTime class(非常可能):
$date = new DateTime('2018-01-27');
$date->modify('+7 weekday');
echo $date->format('Y-m-d');
想要跳过假期?:
虽然原始海报提到“我不需要考虑假期”,但如果您碰巧想要忽略假期,请记住 - “假期”只是您不想包含的任何日期的数组,因国家,地区,公司,人等而异。
只需将上面的代码放入一个函数中,该函数排除/循环超出您不想包含的日期。像这样:
$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'));
}
我确信如果您愿意,可以简化或缩短上述代码。我试着以一种易于理解的方式写它。
答案 1 :(得分:3)
对于英国假期,您可以使用
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;
}
答案 2 :(得分:2)
这是在PHP中获得工作日(星期一至星期五)的最佳方法。
function days()
{
$week=array();
$weekday=["Monday","Tuesday","Wednesday","Thursday","Friday"];
foreach ($weekday as $key => $value)
{
$sort=$value." this week";
$day=date('D', strtotime($sort));
$date=date('d', strtotime($sort));
$year=date('Y-m-d', strtotime($sort));
$weeks['day']= $day;
$weeks['date']= $date;
$weeks['year']= $year;
$week[]=$weeks;
}
return $week;
}
希望这对您有所帮助。 谢谢。
答案 3 :(得分:1)
function next_business_day($date) {
$add_day = 0;
do {
$add_day++;
$new_date = date('Y-m-d', strtotime("$date +$add_day Days"));
$new_day_of_week = date('w', strtotime($new_date));
} while($new_day_of_week == 6 || $new_day_of_week == 0);
return $new_date;
}
此功能应忽略周末(6 =星期六,0 =星期日)。
答案 4 :(得分:0)
您需要做的是:
将提供的日期转换为时间戳。
将此命令与PHP的date命令的w
或N
格式化程序一起使用,告诉您一周中的哪一天。
如果它不是“营业日”,您可以将时间戳增加一天(86400秒)并再次检查,直到您达到营业日为止。
N.B。:这是真正的工作,你还需要排除任何银行或公众假期等。
答案 5 :(得分:0)
此功能将计算未来或过去的营业日。参数是天数,前进(1)或后退(0)以及日期。如果今天没有提供日期,将使用:
// returned $date Y/m/d
function work_days_from_date($days, $forward, $date=NULL)
{
if(!$date)
{
$date = date('Y-m-d'); // if no date given, use todays date
}
while ($days != 0)
{
$forward == 1 ? $day = strtotime($date.' +1 day') : $day = strtotime($date.' -1 day');
$date = date('Y-m-d',$day);
if( date('N', strtotime($date)) <= 5) // if it's a weekday
{
$days--;
}
}
return $date;
}
答案 6 :(得分:0)
当我在丹麦网站上工作时,我偶然发现了这个帖子,我需要编写一个“第二天交付”PHP脚本。
以下是我提出的建议(这将显示丹麦语下一个工作日的名称,如果当前时间超过给定限制,则显示下一个工作日+1)
$day["Mon"] = "Mandag";
$day["Tue"] = "Tirsdag";
$day["Wed"] = "Onsdag";
$day["Thu"] = "Torsdag";
$day["Fri"] = "Fredag";
$day["Sat"] = "Lørdag";
$day["Sun"] = "Søndag";
date_default_timezone_set('Europe/Copenhagen');
$date = date('l');
$checkTime = '1400';
$date2 = date(strtotime($date.' +1 Weekday'));
if( date( 'Hi' ) >= $checkTime) {
$date2 = date(strtotime($date.' +2 Weekday'));
}
if (date('l') == 'Saturday'){
$date2 = date(strtotime($date.' +2 Weekday'));
}
if (date('l') == 'Sunday') {
$date2 = date(strtotime($date.' +2 Weekday'));
}
echo '<p>Næste levering: <span>'.$day[date("D", $date2)].'</span></p>';
正如您在示例代码中看到的那样,$ checkTime是我设置时间限制的地方,它确定第二天的交付时间是+1个工作日还是+2个工作日。
'1400'= 14:00
我知道if语句可以更加压缩,但我会展示我的代码,让人们可以轻松理解它的工作方式。
我希望有人可以使用这个小片段。
答案 7 :(得分:0)
请参阅以下示例:
$startDate = new DateTime( '2013-04-01' ); //intialize start date
$endDate = new DateTime( '2013-04-30' ); //initialize end date
$holiday = array('2013-04-11','2013-04-25'); //this is assumed list of holiday
$interval = new DateInterval('P1D'); // set the interval as 1 day
$daterange = new DatePeriod($startDate, $interval ,$endDate);
foreach($daterange as $date){
if($date->format("N") <6 AND !in_array($date->format("Y-m-d"),$holiday))
$result[] = $date->format("Y-m-d");
}
echo "<pre>";print_r($result);
了解更多信息:http://goo.gl/YOsfPX
答案 8 :(得分:0)
你可以这样做。
/**
* @param string $date
* @param DateTimeZone|null|null $DateTimeZone
* @return \NavigableDate\NavigableDateInterface
*/
function getNextBusinessDay(string $date, ? DateTimeZone $DateTimeZone = null):\NavigableDate\NavigableDateInterface
{
$Date = \NavigableDate\NavigableDateFacade::create($date, $DateTimeZone);
$NextDay = $Date->nextDay();
while(true)
{
$nextDayIndexInTheWeek = (int) $NextDay->format('N');
// check if the day is between Monday and Friday. In DateTime class php, Monday is 1 and Friday is 5
if ($nextDayIndexInTheWeek >= 1 && $nextDayIndexInTheWeek <= 5)
{
break;
}
$NextDay = $NextDay->nextDay();
}
return $NextDay;
}
$date = '2017-02-24';
$NextBussinessDay = getNextBusinessDay($date);
var_dump($NextBussinessDay->format('Y-m-d'));
输出:
string(10) "2017-02-27"
\NavigableDate\NavigableDateFacade::create($date, $DateTimeZone)
由https://packagist.org/packages/ishworkh/navigable-date提供的php库提供。您需要先使用编辑器或直接下载将此库包含在项目中。
答案 9 :(得分:-1)
我在PHP中使用了以下方法, strtotime()在 le年 2月月份特别不适。
public static function nextWorkingDay($date, $addDays = 1)
{
if (strlen(trim($date)) <= 10) {
$date = trim($date)." 09:00:00";
}
$date = new DateTime($date);
//Add days
$date->add(new DateInterval('P'.$addDays.'D'));
while ($date->format('N') >= 5)
{
$date->add(new DateInterval('P1D'));
}
return $date->format('Y-m-d H:i:s');
}
此解决方案需要5个工作日(如果需要工作6或4天,则可以更改)。如果您想排除更多假期,例如假期,那么只需在while循环中检查其他条件即可。
//
while ($date->format('N') >= 5 && !in_array($date->format('Y-m-d'), self::holidayArray()))