我现在遇到这个问题:考虑到一个月和一年,我需要知道它有多少个工作日(即不包括星期六和星期日的天数)。
看起来很简单,但我很困惑。当然我可以用一个for
循环解决它并检查当天是星期六还是星期天,如果没有增加一个计数器,但这只是简单的愚蠢(和线性时间)考虑到我很确定我可以通过几个部门或模块来逃避。
算法的任何想法?您可以随心所欲地使用PHP 4.4.1的所有功能。
编辑这是一个有效的for
循环实现:
function weekdays_in_month($month, $year)
{
$days_in_month = days_in_month($month); // days_in_month defined somewhere
$first_day = date('w', mktime(0,0,0, $month, 1, $year));
$counter = 0;
for ($i = 0; $i < $days_in_month; $i++)
{
if (($first_day + $i + 1) % 7 >= 2)
$counter++;
}
return $counter;
}
答案 0 :(得分:3)
只需查看29日,30日和31日的工作日(如果存在这些日期)。
添加20。
编辑你的功能:
function weekdays_in_month($month, $year)
{
// NOTE: days_in_month needs $year as input also, to account for leap years
$days_in_month = days_in_month($month, $year); // days_in_month defined somewhere
$first_day = date('w', mktime(0,0,0, $month, 1, $year));
$counter = 20; // first 28 days of month always have 20 weekdays
for ($i = 28; $i < $days_in_month; $i++)
{
if (($first_day + $i + 1) % 7 >= 2)
$counter++;
}
return $counter;
}
答案 1 :(得分:0)
你可以搜索一年中的第一个和最后一个星期日,然后将这两个日期的天数除以7。在星期六做同样的事情,然后你可以从总数中减去星期日和星期六的数量一年中的天数。这是迄今为止我发现的最有效的解决方案。
答案 2 :(得分:0)
发现此解决方案没有for循环(未经测试http://www.phpbuilder.com/board/archive/index.php/t-10267313.html)
function weekdays_in_month($month, $year)
{
$first = mktime(0,0,1,$month,1,$year);
// The first day of the month is also the first day of the
// remaining days after whole weeks are handled.
list($first_day,$days) = explode(' ',date('w t',$first));
$weeks = floor($days/7);
$weekdays = $weeks*5;
$remaining_days = $days-$weeks*7;
if($remaining_days==0)
return $weekdays; // Only happens most Februarys
$weekdays += $remaining_days-1;
// Neither starts on Sunday nor ends on Saturday
if($first_day!=0 && ($first_day+$days-1)%7!=6)
{ // Adjust for weekend days.
$weekdays += ($remaining_days<=(6-$first_day))-
($remaining_days>(6-$first_day));
}
return $weekdays;
}