【问题标题】:Get 3 next working dates, skip weekends and holidays获得 3 个下一个工作日期,跳过周末和节假日
【发布时间】:2014-01-15 16:30:39
【问题描述】:

我正在尝试使用 php 获取接下来的 3 天,但如果日期是周末或已定义的假期,我想跳过该日期。

例如,如果日期是 2013 年 12 月 23 日星期一 我的假期日期是array('2013-12-24', '2013-12-25'); 脚本将返回

Monday, December 23, 2013
Thursday, December 26, 2013
Friday, December 27, 2013
Monday, December 30, 2013

她是我当前的代码:

$arr_date = explode('-', '2013-12-23');
$counter = 0;
for ($iLoop = 0; $iLoop < 4; $iLoop++)
{
    $dayOfTheWeek = date("N", mktime(0, 0, 0, $arr_date[1], $arr_date[2]+$counter, $arr_date[0]));
    if ($dayOfTheWeek == 6) { $counter += 2; }
    $date = date("Y-m-d", mktime(0, 0, 0, $arr_date[1], $arr_date[2]+$counter, $arr_date[0]));
    echo $date;
    $counter++;
}

我遇到的问题是我什至不确定如何排除假期日期。

【问题讨论】:

  • This answer 有很多你可以使用的逻辑
  • 好的。那么到目前为止你尝试了什么?什么不工作?
  • 另外,请按照Stack Overflow guidelines显示您当前正在处理的代码。
  • @NobleUplift 这是一个打字错误,它应该是一个23
  • 我现在把代码放在一起。

标签: php date


【解决方案1】:

使用DateTime 在接下来的几天内递归,并使用in_array 进行字符串比较检查以查看下一个生成的日期是否属于假日或周末数组

$holidays = array('12-24', '12-25');
$weekend = array('Sun','Sat');
$date = new DateTime('2013-12-23');
$nextDay = clone $date;
$i = 0; // We have 0 future dates to start with
$nextDates = array(); // Empty array to hold the next 3 dates
while ($i < 3)
{
    $nextDay->add(new DateInterval('P1D')); // Add 1 day
    if (in_array($nextDay->format('m-d'), $holidays)) continue; // Don't include year to ensure the check is year independent
    // Note that you may need to do more complicated things for special holidays that don't use specific dates like "the last Friday of this month"
    if (in_array($nextDay->format('D'), $weekend)) continue;
    // These next lines will only execute if continue isn't called for this iteration
    $nextDates[] = $nextDay->format('Y-m-d');
    $i++;
}

isset() 的建议用于O(1) 而不是O(n)

$holidays = array('12-24' => '', '12-25' => '');
$weekend = array('Sun' => '','Sat' => '');
$date = new DateTime('2013-12-23');
$dayInterval = new DateInterval('P1D');
$nextDay = clone $date;
$i = 0;
$nextDates = array();
while ($i < 3)
{
    $nextDay->add($dayInterval);
    if (isset($holidays[$nextDay->format('m-d')])) continue;
    if (isset($weekend[$nextDay->format('D')])) continue;
    $nextDates[] = $nextDay->format('Y-m-d');
    $i++;
}

【讨论】:

  • 这很完美,甚至很容易修改以使用我的数据库!谢谢。
  • @RobertE.McIntosh 没问题 - 我添加了一些评论。您可能还必须找到一种优雅的方式来检查具有非特定日期的假期,例如Victoria Day(例如,如果您是加拿大人)
  • 不是说if (in_array($nextDay-&gt;format('Y-m-d'), $holidays))那么简单吗?
  • @RobertE.McIntosh 你可以这样做,但是你每年都要手动向$holidays 添加日期(这并不优雅。)请注意我是如何将这一年排除在外的,这样它就可以在每个一年没有任何干预?好的做法是对这些其他类型的日期做同样的事情。没必要,但“很高兴”
  • 你是对的。但是该应用程序已经依赖于客户端输入的休息日。我对此并不担心,但我确实了解您来自哪里,也许请第三次检查休息日并独自度过假期。
【解决方案2】:

Here is a simple example 获取两个日期之间的工作日数;您可以简单地修改它以满足您的需求:

function number_of_working_dates($from, $days) {
    $workingDays = [1, 2, 3, 4, 5]; # date format = N (1 = Monday, ...)
    $holidayDays = ['*-12-25', '*-01-01', '2013-12-24', '2013-12-25']; # variable and fixed holidays

    $from = new DateTime($from);
    $dates = [];
    $dates[] = $from->format('Y-m-d');
    while ($days) {
        $from->modify('+1 day');

        if (!in_array($from->format('N'), $workingDays)) continue;
        if (in_array($from->format('Y-m-d'), $holidayDays)) continue;
        if (in_array($from->format('*-m-d'), $holidayDays)) continue;

        $dates[] = $from->format('Y-m-d');
        $days--;
    }
    return $dates;
}

print_r( number_of_working_dates('2013-12-23', 3) );

demo

【讨论】:

  • 这很好用,非常感谢。我想从数据库中生成$holidayDays 变量$qry_hk = "SELECT holiday FROM dim_holiday_dates"; $result_hk = mysqli_query($db,$qry_hk); $holidayDays = [while ($data_hk = mysqli_fetch_array($result_hk)) {echo '"'.$data_hk['holiday'].'",';}]; 但错误Parse error: syntax error, unexpected 'while' (T_WHILE), expecting ']' in 帮助我
猜你喜欢
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 2012-08-22
  • 2019-02-13
相关资源
最近更新 更多