7

特定の月と年の平日の日数を計算したい。平日とは、月曜日から金曜日までを意味します。どうすればいいのですか ?

4

13 に答える 13

26

月の毎日を数える必要はありません。何があっても、最初の 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;
}
于 2012-10-15T20:59:13.207 に答える
2

いくつかの基本的なコード:

$month = 12;
$weekdays = array();
$d = 1;

do {
    $mk = mktime(0, 0, 0, $month, $d, date("Y"));
    @$weekdays[date("w", $mk)]++;
    $d++;
} while (date("m", $mk) == $month);

print_r($weekdays);

@PHP エラー警告に通知が表示されない場合は削除してください。

于 2011-12-06T11:27:28.853 に答える
2

これを試してください

function getWeekdays($m, $y = NULL){
    $arrDtext = array('Mon', 'Tue', 'Wed', 'Thu', 'Fri');

    if(is_null($y) || (!is_null($y) && $y == ''))
        $y = date('Y');

    $d = 1;
    $timestamp = mktime(0,0,0,$m,$d,$y);
    $lastDate = date('t', $timestamp);
    $workingDays = 0;
    for($i=$d; $i<=$lastDate; $i++){
        if(in_array(date('D', mktime(0,0,0,$m,$i,$y)), $arrDtext)){
            $workingDays++;
        }
    }
    return $workingDays;
}
于 2011-12-06T16:37:50.953 に答える
1

これは私が思いついた最も単純なコードです。実際には、休日を保持する配列またはデータベース テーブルを作成して、実際の「稼働日」のカウントを取得する必要がありますが、それは求められたものではありませんでした。

function get_weekdays($m,$y) {
$lastday = date("t",mktime(0,0,0,$m,1,$y));
$weekdays=0;
for($d=1;$d<=$lastday;$d++) {
    $wd = date("w",mktime(0,0,0,$m,$d,$y));
    if($wd > 0 && $wd < 6) $weekdays++;
    }
return $weekdays;
}
于 2012-02-08T15:54:12.747 に答える
1

2 つの日付間の休日なしの稼働日数を取得します。

使用例:

echo number_of_working_days('2013-12-23', '2013-12-29');

出力:

3

関数へのリンク

于 2013-09-21T10:04:32.663 に答える
0

特定の月の最後の日と平日を見つけて、次の
ような単純な while ループを実行します。

$dates = explode(',', date('t,N', strtotime('2013-11-01')));
$day = $dates[1]; 
$tot = $dates[0]; 
$cnt = 0;
while ($tot>1)
{   
    if ($day < 6)
    {   
        $cnt++;
    }   
    if ($day == 1)
    {   
        $day = 7;
    }   
    else
    {   
        $day--;
    }   
    $tot--;
}

$cnt = 特定の月の平日 (月曜日から金曜日) の合計

于 2011-12-06T16:49:32.290 に答える
0

$first_day_of_month (日曜日/月曜日などの曜日) を取る単純な関数を作成しました。次のようにして、月の初日を確認できます。

date('N', strtotime(date("01-m-Y")));

そして、次のように調達できる $month_last_date を使用します。

date("t");

関数は次のとおりです。

function workingDaysInMonth(int $first_day_of_month, int $month_last_date) : array
{
    $working_days = [];
    $day = $first_day_of_month;
    $working_day_count = 0;
    for ($i = 1; $i <= $month_last_date; $i++) {
        if ($day == 8) {
            $day = 1;
        }
        if (!($day == 6 || $day == 7)) {
            $working_day_count++;
            $working_days[$i] = $working_day_count;
        }
        $day++;
    }
    return $working_days;
}
于 2021-04-26T17:25:06.947 に答える
0

これらの関数はループなしで機能します。

関数は、以下を使用して平日の数を計算します。

  • 月の最初の月曜日の日番号
  • 月の日数
// main functions 
// weekdays in month of year
function calculateNumberOfWeekDaysAtDate($month, $year)
{
    // I'm sorry, I don't know the right format for the $month and $year, I hope this is right.
    // PLEASE CORRECT IF WRONG
    $firstMondayInCurrentMonth = (int) date("j", strtotime("first monday of 01-$month-$year")); //get first monday in month for calculations
    $numberOfDaysOfCurrentMonth = (int) date("t", strtotime("01-$month-$year")); // number of days in month

    return calculateNumberOfWeekDaysFromFirstMondayAndNumberOfMonthDays($firstMondayInCurrentMonth, $numberOfDaysOfCurrentMonth);
}

// week days in current month
function calculateNumberOfWeekDaysInCurrentMonth()
{
    $firstMondayInCurrentMonth = (int) date("j", strtotime("first monday of this month")); //get first monday in month for calculations
    $numberOfDaysOfCurrentMonth = (int) date("t"); // number of days in this month

    return calculateNumberOfWeekDaysFromFirstMondayAndNumberOfMonthDays($firstMondayInCurrentMonth, $numberOfDaysOfCurrentMonth);
}

// helper functions
function calculateNumberOfWeekDaysFromFirstMondayAndNumberOfMonthDays($firstMondayInCurrentMonth, $numberOfDaysOfCurrentMonth)
{
    return $numberOfWeekDays = (($start = ($firstMondayInCurrentMonth - 3)) < 0 ? 0 : $start) + floor(($numberOfDaysOfCurrentMonth - ($firstMondayInCurrentMonth - 1)) / 7) * 5 + (($rest = (($numberOfDaysOfCurrentMonth - ($firstMondayInCurrentMonth - 1)) % 7)) <= 5 ? $rest : 5);
}
于 2018-04-11T14:51:53.423 に答える