Date qui merde pour le mois de Janvier 2010

Petit nouveau ! | 3 Messages

02 avr. 2010, 08:14

Bien le bonjour,

Je viens de terminer de coder une fonction simple qui me génère un calendrier à partir d'un mois et d'une année.
La fonction est appelée comme ceci (dans cet exemple, pour Avril 2010) :
echo getCalendar('04-2010');
et voici la fonction :
function getCalendar($value)
{
  $workValues = explode('-', $value);
  $month      = $workValues[0];
  $year       = $workValues[1];
  
  $currentDay = date('d-m-Y');

  $firstDay   = date('N', mktime(0, 0, 0, $month, 1, $year)); // position dans la semaine du premier jour du mois
  $lastDay    = date('t', mktime(0, 0, 0, $month, 1, $year)); // nombre de jours dans le mois

  $firstWeek  = date('W', mktime(0, 0, 0, $month, 1, $year)); // numéro de la première semaine du mois
  $lastWeek   = date('W', mktime(0, 0, 0, $month, $lastDay, $year)); // numéro de la dernière semaine du mois

  $monthWeeks = ($lastWeek + 1) - $firstWeek; // nombre de semaines dans le mois

  $calendar = '  <table>
  <tr>
    <th scope="col"><acronym title="Lundi">Lu</acronym></th>
    <th scope="col"><acronym title="Mardi">Ma</acronym></th>
    <th scope="col"><acronym title="Mercredi">Me</acronym></th>
    <th scope="col"><acronym title="Jeudi">Je</acronym></th>
    <th scope="col"><acronym title="Vendredi">Ve</acronym></th>
    <th scope="col"><acronym title="Samedi">Sa</acronym></th>
    <th scope="col"><acronym title="Dimanche">Di</acronym></th>
  </tr>
';

  $step        = 1;
  $currentWeek = 1;
  $day         = 1;

  while ($currentWeek <= $monthWeeks)
  {
    $calendar .= "  <tr>";

    for ($i = 1; $i <= 7; $i++)
    {
      if (($step >= $firstDay)
       && ($day  <= $lastDay))
      {
        if ($currentDay == date('d-m-Y', mktime(0, 0, 0, $month, $day, $year)))
        { $id = ' id="current"'; } else { $id = ''; }

        $calendar .= "\n    <td$id><p>$day</p></td>";
        $day++;
      }
      else { $calendar .= "\n    <td><p></p></td>"; }

      $step++;
    }

    $calendar .= "\n  </tr>\n";
    $currentWeek++;
  }

  $calendar .= "  </table>\n";

  return $calendar;
}
Cela fonctionne parfaitement pour n'importe quelle combinaison de mois/année sauf pour janvier 2010 (donc 01-2010).
Auriez-vous une idée quant à l'origine de ce problème ?

Merci d'avance ;)
Modifié en dernier par m4cfly le 02 avr. 2010, 08:31, modifié 1 fois.

Mammouth du PHP | 661 Messages

02 avr. 2010, 08:29

- et c'est quoi qui ne fonctionne pas ?
- t'as vérifié tes variables firstday, lastday, .... ?
- pourquoi dis tu appeler mars en demandant avril ? (un bug de transcription ?)

Petit nouveau ! | 3 Messages

02 avr. 2010, 08:35

Bonjour et merci pour ta réponse.

> c'est quoi qui ne fonctionne pas ?
La génération du calendrier pour le mois de Janvier 2010.

> t'as vérifié tes variables firstday, lastday, .... ?
Oui, ça ne semble pas venir de là.

> pourquoi dis tu appeler mars en demandant avril ?
Il s'agissait en effet d'une erreur de retranscription (j'ai corrigé le mot "Avril") ;)

Eléphant du PHP | 422 Messages

02 avr. 2010, 10:06

> c'est quoi qui ne fonctionne pas ?
La génération du calendrier pour le mois de Janvier 2010.
ca on a compris :) mais ca fait quoi ? message d'erreur (si oui nous le donner), sa affiche un mauvais calendrier (nous dire lequel) ...

... il faut nous dire quoi


++
toujours faire une recherche sur http://www.php.net et/ou sur http://www.google.fr :)
utiliser http://ideone.com/ pour vos codes :)

Eléphanteau du PHP | 27 Messages

02 avr. 2010, 12:01

Bonjour, de mémoire j'ai déjà rencontré ce défaut

en fait la fonction date de PHP ne te renvoi pas la semaine 1 pour la première semaine de de 2010 mais la semaine 53

de là, ta variable firstweek est erronée pour 2010 :(

Je n'ai plus la solution en tête, mais une condition de test sur cette variable devrait le faire

Nota: ceci est spécifique pour 2010, en 2009 ce défaut n'est pas !
Développeur PHP à temps perdu ...
PHP Maximus CMS , un cms plus petit PHP Minimus, un cms minimaliste PHP Nanomus, un pare feu pour votre site PHP Firewall

Mammouth du PHP | 672 Messages

02 avr. 2010, 15:20

Bonjour, de mémoire j'ai déjà rencontré ce défaut

en fait la fonction date de PHP ne te renvoi pas la semaine 1 pour la première semaine de de 2010 mais la semaine 53

de là, ta variable firstweek est erronée pour 2010 :(

Je n'ai plus la solution en tête, mais une condition de test sur cette variable devrait le faire

Nota: ceci est spécifique pour 2010, en 2009 ce défaut n'est pas !
J'ai juste survolé ta fonction, mais je plussoie MaximusCMS (à peu près : ce n'est pas spécifique à 2010, mais à +- la moitié des années).

Pour être plus précis, PHP calcule les semaines en utilisant la norme ISO-8601.
Donc :
- La semaine commence le lundi.
- La semaine 1 est celle qui contient le premier jeudi de l'année.
En 2010; le 1er janvier était un vendredi, donc la première semaine de 2010 est la semaine du jeudi 7.

Conclusion : évite de te baser sur ses semaines pour ton calendrier :non:
Utilise plutôt le jour de la semaine...

ViPHP
ViPHP | 5462 Messages

02 avr. 2010, 15:30

utilisez DateTime, et DatePeriod vous vous embetez la

Eléphanteau du PHP | 27 Messages

02 avr. 2010, 16:09

désolé macgawel de t'avoir laissé sous entendre que ce phénomène n'était valable QUE pour 2010, mais je 'plussoie' aussi mdr :lol:

par contre que cette méthode soit délicate pour QUE la première semaine, c'est un fait acquis :)

l'idéal comme l'invite stealth35 est de baser le calendrier sur un autre code =D>
Développeur PHP à temps perdu ...
PHP Maximus CMS , un cms plus petit PHP Minimus, un cms minimaliste PHP Nanomus, un pare feu pour votre site PHP Firewall

Petit nouveau ! | 3 Messages

02 avr. 2010, 16:58

Bonjour et merci à tous pour vos réponses.

J'ai résolu le problème en ajoutant la ligne suivante :
if ($firstWeek == 53) { $firstWeek = 0; }
avant la ligne :
$monthWeeks = ($lastWeek + 1) - $firstWeek; // nombre de semaines dans le mois
Ça m'évite d'avoir à recoder ma fonction from scratch.

@stealth35 : pourrais-tu détailler ta réponse s'il-te plait ?