查找一个月内的所有工作日

时间:2011-06-15 14:23:19

标签: php date time

如何在特定时间段内获得所有工作天(周一至周五)(比方说,直到下个月月底)?

7 个答案:

答案 0 :(得分:3)

如果您使用的是PHP 5.2+,则可以使用我编写的库来处理名为When的PHP中的日期递归。

使用库,代码将类似于:

$r = new When();
$r->recur(<start date here>, 'weekly')
  ->until(<end date here>)
  ->wkst('SU')
  ->byday(array('MO', 'TU', 'WE', 'TH', 'FR'));

while($result = $r->next())
{
    echo $result->format('c') . '<br />';
}

答案 1 :(得分:2)

在此处试试:http://codepad.org/wuAyAqnF

要使用它,只需将时间戳传递给get_weekdays即可。你可以在当月剩下的时间里找到所有工作日的数组,作为时间戳。或者,您可以传递$to参数 - 您将在$from$to之间获得所有工作日。

function get_weekdays ($from, $to=false) {
    if ($to == false)
        $to = last_day_of_month($from);

    $days = array();

    for ($x = $from; $x < $to; $x+=86400 ) {
        if (date('w', $x) > 0 && date('w', $x) < 6)
            $days[] = $x;
    }
    return $days;       
}

function last_day_of_month($ts=false) {
    $m = date('m', $ts);
    $y = date('y', $ts);
    return mktime(23, 59, 59, ($m+1), 0, $y);
}

答案 2 :(得分:2)

此示例以快速有效的方式完全满足您的需求。 它不执行嵌套循环并使用完全令人敬畏的DateTime对象。

$oDateTime = new DateTime();
$oDayIncrease = new DateInterval("P1D");

$aWeekDays = array();
$sStart = $oDateTime->format("m-Y");
while($oDateTime->format("m-Y") == $sStart) {
    $iDayInWeek = $oDateTime->format("w");
    if ($iDayInWeek > 0 && $iDayInWeek < 6) {
        $aWeekDays[] = clone $oDateTime;

    }
    $oDateTime->add($oDayIncrease);
}

答案 3 :(得分:1)

我想你可以遍历日期并查看每个日期的,并增加一个计数器。

无法想到其他任何事情。

答案 4 :(得分:1)

Pseudocode顺其自然:

计算从现在到该月的最后一天之间的天数 获取当周的当天(即星期三) 根据当周的当天以及当月剩余的天数,可以通过简单的计算来计算当月剩余的周末天数 - 它将是该月剩余的天数,减去本月剩余的星期日/星期六。

我会编写一个函数,例如:

daysLeftInMonth(daysLeftInMonth, startingDayOfWeek, dayOfWeekToCalculate)

其中:

  • daysLeftInMonth是该月的最后一天(30),减去当前日期(15)
  • startingDayOfWeek是您想要开始的一周中的一天(今天是星期三)
  • dayOfWeekToCalculate是您想要计算的星期几,例如周六或周日。 2011年6月目前有2个星期天,2个星期六离开“直到月底”

所以,你的算法就像:

getWeekdaysLeft(todaysDate)

... getWeekdaysLeft类似于:

sundaysLeft = daysLeftInMonth(lastDayOfMonth - todaysDate, "Wednesday", "Sunday");
saturdaysLeft = daysLeftInMonth(lastDayOfMonth - todaysDate, "Wednesday", "Saturday");
return ((lastDayOfMonth - todaysDate) - (sundaysLeft + saturdaysLeft));

答案 5 :(得分:1)

此代码至少执行您要求的一部分。它不是“下个月末”,而是在给定的天数内工作。

$dfrom = time();
$fourweeks = 7 * 4;

for ($i = 0; $i < $fourweeks; $i ++) {
    $stamp = $dfrom + ($i * 24 * 60 * 60);
    $weekday = date("D", $stamp);
    if (in_array($weekday, array("Mon", "Tue", "Wed", "Thu", "Fri"))) {
        print date(DATE_RSS, $stamp) . "\n";
    }
}

答案 6 :(得分:1)

// Find today's day of the month (i.e. 15)
$today = intval(date('d'));

// Define the array that will hold the work days.
$work_days = array()

// Find this month's last day. (i.e. 30)
$last = intval(date('d', strtotime('last day of this month')));

// Loop through all of the days between today and the last day of the month (i.e. 15 through 30)
for ( $i = $today; $i <= $last; $i++ )
{
  // Create a timestamp.
  $timestamp = mktime(null, null, null, null, $i);

  // If the day of the week is greater than Sunday (0) but less than Saturday (6), add the timestamp to an array.
  if ( intval(date('w', $timestamp)) > 0 && intval(date('w', $timestamp)) < 6 )
    $work_days[] = mktime($timestamp);
}

$work_days数组将包含您可以使用这种方式的时间戳:

echo date('Y-m-d', $work_days[0]);

上面的代码在PHP 4以及PHP 5中工作。它不依赖于DateTime类的功能,该功能在PHP 5.2之前不可用,并且不需要使用由其他人创建的“库”。