htmlcss.fr Des tutos ou tutoriels Wordpress, html, php ou javascript.

Date / période en php

D

J’ai souvent affaire avec des événements / agenda et je dois régulièrement savoir si la ou les dates de l’évènement en question se déroulent cette semaine ou le mois prochain par exemple. Je me suis donc fais une petite fonction maison pour savoir quand l’évènement se produira et pouvoir gérer l’affichage en front.

Cas d’école

Quand on a une liste d’évènements, il y a presque toujours des filtres pour nous permettre de trouver facilement ce qu’on cherche. Et bien souvent il y a un filtre par date, un petit select avec les choix suivants:

  • Aujourd’hui
  • Demain
  • Ce week-end
  • Cette semaine
  • La semaine prochaine
  • Ce mois-ci
  • Le mois prochain
  • Prochainement ( le futur )

Et là, ça devient un peu compliqué de géré les cas ou l’évènement est sur une journée ou plusieurs jours.

Comment ça fonctionne

Dans le backoffice, il vous faut deux champs: début et fin. Ils doivent retourner la date au format YYYYMMDD. C’est en générale plus plus facile de gérer les dates ayant ce format.
Ensuite il vous suffit de donner le début et la fin à la fonction.
Par exemple avec le mardi 20 juillet 2021 ( aujourd’hui, soit 20210720 ):

$periode = get_periode_range(20210720,20210720);

Ici la fonction va retourner le tableau suivant qui indique que la plage date se déroule:

Array
(
    [0] => 1   // Aujourd'hui
    [1] => 4   // Cette semaine
    [2] => 6   // Ce mois-ci
)

Ensuite vous pourriez par exemple injecter ce tableau dans un attribut data sur les éléments HTML et les masquer ou non lors de l’évènement onChange du select.

Voici la fonction en question qui, j’espère, vous fera gagner un peu de temps :

function get_periode_range($debut,$fin)
{
  //https: //www.php.net/manual/fr/datetime.format.php
  /*
    1 Aujourd'hui
    2 Demain
    3 Ce week-end
    4 Cette semaine
    5 La semaine prochaine
    6 Ce mois-ci
    7 le mois prochain
    8 le turfu
  */
  $debut = (int)$debut;
  $fin = (int)$fin;
  $today = (int)date('Ymd');
  $tomorrow = (int)date("Ymd", strtotime("+1 day"));

  $current_month = (int)date('n'); //	Mois sans les zéros initiaux
  $current_day = (int)date("N"); //1 (pour Lundi) à 7 (pour Dimanche)
  $current_week = (int)date("W"); // numero de la semaine
  $next_month = $current_month + 1;

  $dtdebut = new DateTime($debut);
  $week_debut = (int)$dtdebut->format("W");
  $day_debut = (int)$dtdebut->format("N");
  $month_debut = (int)$dtdebut->format("n");

  $dtdfin = new DateTime($fin);
  $week_fin = (int)$dtdfin->format("W");
  $day_fin = (int)$dtdfin->format("N");
  $month_fin = (int)$dtdfin->format("n");

  $tab_periode = [];
  /////////////////////
  //Test des periodes
  /////////////////////
  // si l'event à lieu que sur une seul journée
  if($debut === $fin){
    //Aujourd'hui
    if($today === $debut) {
      $tab_periode[] = 1;
    }
    //Demain
    if($tomorrow === $debut) {
      $tab_periode[] = 2;
    }
    //Ce week-end
    if($current_week === $week_debut){
      if($day_debut === 6 || $day_debut === 7){
        $tab_periode[] = 3;
      }
    }
    //Cette semaine
    if ($current_week === $week_debut) {
      $tab_periode[] = 4;
    }
    //La semaine prochaine
    if (($current_week+1) === $week_debut) {
      $tab_periode[] = 5;
    }
    //Ce mois-ci
    if ($current_month === $month_debut) {
      $tab_periode[] = 6;
    }
    //le mois prochain
    if ($next_month === $month_debut) {
      $tab_periode[] = 7;
    }
    //le turfu
    if ($month_debut > $next_month) {
      $tab_periode[] = 8;
    }
  }

  // si c est sur une periode
  if($debut < $fin){
    //Aujourd'hui
    if( $today >= $debut && $today <= $fin){
      $tab_periode[] = 1;
    }
    // Demain
    if( $tomorrow >= $debut && $tomorrow <= $fin){
      $tab_periode[] = 2;
    }
    //Ce week-end
    if($current_week === $week_fin && $day_fin >= 6) {
      $tab_periode[] = 3;
    }
    //Cette semaine
    if ($current_week >= $week_debut && $current_week <= $week_fin) {
      $tab_periode[] = 4;
    }
    //La semaine prochaine
    if ( ($current_week+1) === $week_fin) {
      $tab_periode[] = 5;
    }
    //Ce mois-ci
    if ($current_month >= $month_debut) {
      $tab_periode[] = 6;
    }
    //le mois prochain
    if ($next_month === $month_fin) {
      $tab_periode[] = 7;
    }
    //le turfu
    if ($month_debut > $next_month) {
      $tab_periode[] = 8;
    }
  }

  return $tab_periode;
}
htmlcss.fr Des tutos ou tutoriels Wordpress, html, php ou javascript.

François Riant

Je m’appelle François Riant. Je travail dans les métiers du web depuis 2006. Mon expérience m’a amené à changer plusieurs fois de technologie.

Aujourd’hui je cherche à partager mon expérience et j’y trouve du de plaisir. Je travail actuellement chez W2P Digital.
Je ne prends donc pas de mission en freelance.

Si vous avez une remarque ou une question; vous pouvez me joindre sur francois.riant@gmail.com