9

重複の可能性:
特定の月の平日の数を取得する

任意の月の稼働日を計算する方法は? cal_days_in_month単純に 1 か月の合計日数を返します。私の仕事は、土曜日と日曜日または日曜日だけを除いて、月の日数を計算することです。これを見つける方法はありますか?

4

5 に答える 5

16
function countDays($year, $month, $ignore) {
    $count = 0;
    $counter = mktime(0, 0, 0, $month, 1, $year);
    while (date("n", $counter) == $month) {
        if (in_array(date("w", $counter), $ignore) == false) {
            $count++;
        }
        $counter = strtotime("+1 day", $counter);
    }
    return $count;
}
echo countDays(2013, 1, array(0, 6)); // 23

このdate関数は、この例で使用されます。無視パラメータに関する注意: 0 は日曜日、...、6 は土曜日です。

于 2013-01-06T19:51:24.020 に答える
13

copying second answer from :特定の月の平日の数を取得する

月の毎日を数える必要はありません。何があっても、最初の 28 日間には 20 の平日が含まれることは既にご存じでしょう。あなたがしなければならないのは、過去数日を決定することだけです。開始値を 29 に変更します。次に、戻り値に 20 平日を追加します。

function get_weekdays($m,$y) {
$lastday = date("t",mktime(0,0,0,$m,1,$y));
$weekdays=0;
for($d=29;$d<=$lastday;$d++) {
    $wd = date("w",mktime(0,0,0,$m,$d,$y));
    if($wd > 0 && $wd < 6) $weekdays++;
    }
return $weekdays+20;
}

これはあなたの問題を解決するはずであり、実際に効率的な解決策です。

于 2013-01-06T19:50:43.250 に答える
4

シンプルな (あまり洗練されていない) 答えは、月の最初の日のタイム スタンプを作成し、date() を使用してその月の物理的な名前を取得し、switch または if のいずれかを使用して平日かどうかを判断することです。 .

$myTime = strtotime("1/1/2013");  // Use whatever date format you want
$daysInMonth = cal_days_in_month(CAL_GREGORIAN, 1, 2013); // 31
$workDays = 0;

while($daysInMonth > 0)
{
    $day = date("D", $myTime); // Sun - Sat
    if($day != "Sun" && $day != "Sat")
        $workDays++;

    $daysInMonth--;
    $myTime += 86400; // 86,400 seconds = 24 hrs.
}

echo "There are $workDays work days this month!";

出力

There are 23 work days this month!

http://php.net/manual/en/function.strtotime.php

http://php.net/manual/en/function.date.php

于 2013-01-06T19:50:41.747 に答える
1

グーグル検索してみろよ。

後世のために、あなたのアルゴリズム:

  • date() を使用して、月の日数を取得します。
  • (1) 日から始めて、mktime/gmmktime を使用してエポック タイムスタンプを作成し、date() を使用してそれが表す曜日を決定します。
  • 最初の営業日 (月曜日) が見つかるまで繰り返します。これを「い」とします。
  • 現在の集計値を "t" とし、その初期値は (0) です。
  • j = i とします。ここで、j は (i + 5) 未満であり、その月の最大日数未満であり、t をインクリメントします。(2) ずつ増やして (週末をスキップするため)、この行の先頭から "i" がその月の最大日数を超えるまで繰り返します。
  • 成功と幸福を適用し、最初から総稼働日数が (0) になるまで繰り返します。
于 2013-01-06T19:54:07.107 に答える
0
function countDays($y, $m, $ignore = false) 
{
    $result = 0;
    $loop = strtotime("$y-$m-01");
    do if(!$ignore or !in_array(strftime("%u",$loop),$ignore))
        $result++;
    while(strftime("%m",$loop = strtotime("+1 day",$loop))==$m);
    return $result;
}
echo countDays(2013,1,array(6,7));//23
echo countDays(2013,2);//28
于 2013-01-06T20:25:27.870 に答える