重複の可能性:
特定の月の平日の数を取得する
任意の月の稼働日を計算する方法は? cal_days_in_month
単純に 1 か月の合計日数を返します。私の仕事は、土曜日と日曜日または日曜日だけを除いて、月の日数を計算することです。これを見つける方法はありますか?
重複の可能性:
特定の月の平日の数を取得する
任意の月の稼働日を計算する方法は? cal_days_in_month
単純に 1 か月の合計日数を返します。私の仕事は、土曜日と日曜日または日曜日だけを除いて、月の日数を計算することです。これを見つける方法はありますか?
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 は土曜日です。
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;
}
これはあなたの問題を解決するはずであり、実際に効率的な解決策です。
シンプルな (あまり洗練されていない) 答えは、月の最初の日のタイム スタンプを作成し、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!
グーグル検索してみろよ。
後世のために、あなたのアルゴリズム:
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