Pertanyaan Bagaimana saya bisa mengetahui jumlah minggu dalam sebulan?


Saya mengalami masalah ini sekarang: diberikan satu bulan dan satu tahun, saya perlu tahu berapa hari minggu yang dimilikinya (yaitu, jumlah hari kecuali Sabtu dan Minggu).

Tampaknya sangat sederhana, namun saya bingung. Tentu saja saya bisa menyelesaikannya dengan for loop dan periksa apakah hari ini adalah hari Sabtu atau Minggu, dan jika tidak menambah penghitung, tetapi ini hanya bodoh (dan waktu linear) mengingat saya cukup yakin saya bisa lolos dengan beberapa divisi atau modulos.

Ada gagasan tentang algoritma? Anda memiliki semua kekuatan PHP 4.4.1 yang Anda inginkan.


EDIT Ini berfungsi for implementasi loop:

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;
}

4
2018-02-10 21:55


asal


Jawaban:


Cukup periksa hari kerja-ke-29, 30, dan 31 (jika tanggal ini ada).

Tambahkan 20.

Mengedit fungsi Anda:

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;
}

3
2018-02-10 22:04



Anda dapat mencari minggu pertama dan terakhir di tahun itu dan kemudian membagi perbedaan dalam hari-hari dari dua tanggal dengan 7. Lakukan hal yang sama untuk hari Sabtu dan kemudian Anda dapat mengurangi jumlah minggu dan hari sabtu dari total jumlah hari di tahun. Itu adalah solusi paling efisien yang saya temukan sejauh ini.


0
2018-02-10 22:01



Menemukan solusi ini tanpa loop (belum dicoba dari 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;
}

0
2018-02-10 22:07