2011-02-10 5 views
4

J'ai ce problème en ce moment: étant donné un mois et un an, j'ai besoin de connaître le nombre de jours de la semaine (c'est-à-dire le nombre de jours sauf samedi et dimanche).Comment puis-je calculer le nombre de jours de la semaine dans un mois?

Cela semble si simple, et pourtant je suis déconcerté. Bien sûr, je pourrais le résoudre avec une boucle for et vérifier si le jour est un samedi ou un dimanche, et si ce n'est pas incrémenter un compteur, mais c'est tout simplement stupide (et linéaire) vu que je suis sûr que je pourrais m'en tirer quelques divisions ou modulos.

Une idée de l'algorithme? Vous avez toute la puissance de PHP 4.4.1 à votre disposition.


EDIT Voici une for mise en œuvre de la boucle de travail:

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

Jusqu'où dans le temps voulez-vous que cela fonctionne ? Cela devient * beaucoup * plus difficile si vous revenez assez loin pour que les transitions de règles de calendrier soient un problème. – Flexo

+0

@awoodland Ouais ne vous inquiétez pas à ce sujet. Il doit fonctionner à partir de 2010 environ. – zneak

+0

'days_in_month' a également besoin de' $ year' comme entrée (pour tenir compte des années bissextiles). – John

Répondre

3

Vérifiez simplement les jours de semaine des 29, 30 et 31 (si ces dates existent).

Ajouter 20.

Modification de votre fonction:

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

Vous venez de Jimmered cette question avec aplomb, bien fait. – MrBoJangles

+0

Hah remercie MrBoJangles! ;) – John

0

Vous pouvez rechercher le premier et le dernier dimanche de l'année, puis diviser la différence de temps de ces deux dates avec 7 Faites la même chose pour samedi et ensuite vous pouvez soustraire le nombre de dimanches et de samedis du nombre total de jours dans l'année. C'est la solution la plus efficace que j'ai trouvée jusqu'ici.

0

cette solution sans trouvé boucle (non testé de 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

La syntaxe PHP me fait mal aux yeux. – MrBoJangles

+0

@MrBoJangles Si les signes du dollar vous blessent, j'espère que quelqu'un d'autre fait votre financement. :) – zneak

+0

J'aime le $ quand j'utilise jQuery. Tout est question de zones de confort, je suppose. – MrBoJangles

Questions connexes