Générer un calendrier

Cette semaine, je me suis un peu désespéré de ne pas trouver une « nouvelle » façon pour générer un calendrier. Surtout, en PHP, la plupart des snipplets n’utilisent même pas l’objet DateTime.
Du coup, je me suis dit « Comment vais je générer un calendrier ? » Oui, c’est un peu basique mais ça voulait aussi dire « Sans pomper du code ».

Mes contraintes

  • Utiliser DateTime
  • Générer les jours avant et après le mois qui complètent les semaines
  • Une solution robuste pour les changements de mois

Solution 1 : Compter à rebours dans la semaine

Une des solutions serait de récupérer le nombre de jours du mois, de regarder quels jours ça tombe (le premier et dernier). Si c’est un mardi, je fais un DateTime::sub (ou add pour la fin du mois) jusqu’à tomber lundi ou dimanche.

Solution 2 : Utiliser le nombre de semaines dans l’année

La solution que j’ai implémenté consiste en la récupération de la date courante, puis de la semaine du premier/dernier jour du mois, pour récupérer le premier / dernier jour des semaines en question.
Il suffit alors de faire une boucle de la première à la dernière semaine. Et en leur sein, de boucler sur le nombre de jours dans une semaine.
Retrouvez un exemple de code ci-dessous

  1. //This way start the week by monday.
  2. //Require PHP 5.4 (for class member access on instantiation)
  3. $date = new \DateTime(); //Get a date
  4. //First and last day for the date's month
  5. $firstDay = new \DateTime($date->format('Y-m-01'));
  6. $lastDay = new \DateTime($date->format('Y-m-' . $date->format('t')));
  7.  
  8. //Get number of first week
  9. $firstWeek = $firstDay->format('W');
  10. //Get number of last week for the mount
  11. $lastWeek = $lastDay->format('W');
  12. $month = array();
  13. // For each week between first and last week of the mount
  14. for ($currentWeek = $firstWeek; $currentWeek < = $lastWeek; $currentWeek++) {
  15.   //For each day in a week
  16.   for ($i = 1; $i <= 7; $i++) {
  17.     $month[$currentWeek][$i] =
  18.       (new \DateTime())->setISODate($date->format('Y'), $currentWeek, $i);
  19.   }
  20. }
  21. //Dump the result, plug here your code !
  22. var_dump($month);
//This way start the week by monday. 
//Require PHP 5.4 (for class member access on instantiation)
$date = new \DateTime(); //Get a date 
//First and last day for the date's month 
$firstDay = new \DateTime($date->format('Y-m-01'));
$lastDay = new \DateTime($date->format('Y-m-' . $date->format('t')));

//Get number of first week
$firstWeek = $firstDay->format('W');
//Get number of last week for the mount
$lastWeek = $lastDay->format('W');
$month = array();
// For each week between first and last week of the mount
for ($currentWeek = $firstWeek; $currentWeek < = $lastWeek; $currentWeek++) {
  //For each day in a week
  for ($i = 1; $i <= 7; $i++) {
    $month[$currentWeek][$i] = 
      (new \DateTime())->setISODate($date->format('Y'), $currentWeek, $i);
  }
}
//Dump the result, plug here your code !
var_dump($month);

Avec un petit rendu ça peut donner quelque chose comme Screenshot de calendrier

Et vous ? Comment générez vous vos calendriers ?

Laisser un commentaire


NOTE - Vous pouvez utiliser les éléments et attributs HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code lang=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" extra="">