Une classe de traitement sur les dates

closeCet article a été publié il y a 6 ans 3 mois 10 jours, il est donc possible qu’il ne soit plus à jour. Les informations proposées sont donc peut-être expirées.

Pour un projet, j’ai eu besoin de faire pas mal de calculs de dates, j’ai donc travaillé sur une petite classe, que j’améliorerai et documenterais avec le temps.

Cette petite classe permet de calculer les Numéros de semaines, de connaitre la date du lundi de la semaine en cours, le lundi suivant, le lundi précédent… et surtout, de calculer un tableau donnant les jours fériés d’une année.

<?php
class InfosDates {
    static $mois = array(
        1=>'Janvier',
        2=>'Février',
        3=>'Mars',
        4=>'Avril',
        5=>'Mai',
        6=>'Juin',
        7=>'Juillet',
        8=>'Août',
        9=>'Septembre',
        10=>'Octobre',
        11=>'Novembre',
        12=>'Decembre'
    );

    static public function is_date($j_date) {
        return preg_match( '`^\d{1,2}/\d{1,2}/\d{4}$`' , $j_date ) ;
    }

    static public function get_liste_mois() {
        return self::$mois;
    }

    static public function get_mois($id_mois) {
        return self::$mois[$id_mois];
    }

    static public function get_num_semaine($date) {
	list($annee, $mois, $jour) = explode('-', $date);
        return date("W", mktime(0, 0, 0, $mois, $jour, $annee));
    }

    static public function get_semaine($date) {
        list($annee, $mois, $jour) = explode('-', self::get_lundi($date));
        $semaine = array();
        for ($i=1; $i<=7; $i++) {
            $semaine[] = date("Y-m-d", mktime(0, 0, 0, $mois, $jour+$i-1, $annee));
        }
        return $semaine;
    }

    static public function get_lundi($date) {
	list($annee, $mois, $jour) = explode('-', $date);
        $jour_semaine = date("N", mktime(0, 0, 0, $mois, $jour, $annee));
        return date("Y-m-d", mktime(0, 0, 0, $mois, $jour - $jour_semaine + 1, $annee));
    }

    static public function get_lundi_suivant($date) {
        list($annee, $mois, $jour) = explode('-', $date);
        return self::get_lundi($jour+7, $mois, $annee);
    }

    static public function get_lundi_precedent($date) {
        list($annee, $mois, $jour) = explode('-', $date);
        return self::get_lundi($jour-7, $mois, $annee);
    }

    static public function premier_jour_mois($date) {
	list($annee, $mois, $jour) = explode('-', $date);
        return date("Y-m-d", mktime(0, 0, 0, $mois, 1, $annee));
    }

    static public function dernier_jour_mois($date) {
	list($annee, $mois, $jour) = explode('-', $date);
        $jour = self::nombre_jours_mois($mois, $annee);
        return date("Y-m-d", mktime(0, 0, 0, $mois, $jour, $annee));
    }

    static public function numero_premier_jour_mois($date) {
	list($annee, $mois, $jour) = explode('-', $date);
        return date("N", mktime(0, 0, 0, $mois, 1, $annee));
    }

    static public function nombre_jours_mois($date) {
	list($annee, $mois, $jour) = explode('-', $date);
        return date('t', mktime(0, 0, 0, $mois, 1, $annee));
    }

    static public function fr_en($date) {
        list($jour, $mois, $annee) = explode('/', $date);
        return $annee.'-'.$mois.'-'.$jour;
    }

    static public function en_fr($date) {
        list($annee, $mois, $jour) = explode('-', $date);
        return $jour.'/'.$mois.'/'.$annee;
    }

    static public function jour_ouvre($date) {
        list($annee, $mois, $jour) = explode('-', $date);
        $j_semaine = date("N", mktime(0, 0, 0, $mois, $jour, $annee));
        if ($j_semaine !=6 && $j_semaine !=7) {
            if (!array_key_exists($date, self::ferie($annee))) {
                // jour ouvré
                return true;
            }
            else {
                // jour non ouvré
                return false;
            }
        }
        else  {
            // jour non ouvré
            return false;
        }
    }

    /**
     * Permet de compter le nombre de jour ouvrés entre 2 dates
     * Un jour est ouvré si ce n'est pas un week end et s'il n'est pas férié
     * @param <Date> $date_debut
     * @param <Date> $date_fin
     * @return <int> $nb_jours_ouvres
     **/
    static public function nb_jours_ouvres($date_debut, $date_fin) {
        list($annee, $mois, $jour) = explode('-', $date_fin);
        $nb_jours_ouvres = 0;
        $timestamp_debut = self::get_timestamp($date_debut);
        $timestamp_fin = self::get_timestamp($date_fin);
        $nb_jours_intervalle = self::nb_jours_intervalle($timestamp_debut, $timestamp_fin);
        $date_temp = $date_debut;
        $tab_date = Array();
        array_push($tab_date, $date_temp);

        //Pour chaque jour entre la date de début et celle de fin
        for ($i = 1; $i <= $nb_jours_intervalle; $i++) {
            //Puis on va incrémenter la date d'un jour : on sépare les éléments
            list($annee, $mois, $jour) = explode('-', $date_temp);

            //Si demain est toujours dans le même mois, on incrémente simplement le jour
            if ($jour + 1 <= self::nombre_jours_mois($mois, $annee)) {
                if ($jour + 1 < '10') $date_temp = $annee.'-'.$mois.'-0'.($jour + 1);
                else $date_temp = $annee.'-'.$mois.'-'.($jour + 1);
            }
            //On ajoute la date au format 'Y-m-d' au tableau
            array_push($tab_date, $date_temp);
        }
        foreach ($tab_date as $date) {
            if (self::jour_ouvre($date)) $nb_jours_ouvres ++;
        }

        return $nb_jours_ouvres;
    }

    static public function get_date($timestamp) {
        return date('Y-m-d', $timestamp);
    }

    static public function get_timestamp($date) {
        list($annee, $mois, $jour) = explode('-', $date);
        return mktime(0, 0, 0, $mois, $jour, $annee);
    }

    static public function nb_jours_intervalle($timestamp_debut, $timestamp_fin) {
        $difference = $timestamp_fin - $timestamp_debut;
        //L'arrondi ci-dessous sert à éviter le problème du changement d'heure
        return round($difference / 86400);
    }

    static public function convert_jour($jour, $format = '%d %B %Y') {
        setlocale(LC_ALL, 'fr_FR');
        return utf8_encode(strftime($format, strtotime($jour)));
    }

    static public function ferie($annee){
        $ferie = array();        

        // une constante
        $jour = 3600*24;

        // les jours fixes
        $ferie[$annee.'-01-01'] = "Jour de l'an";
        $ferie[$annee.'-05-01'] = "Fête du travail";
        $ferie[$annee.'-05-08'] = "Armistice 39-45";
        $ferie[$annee.'-07-14'] = "Fête Nationale";
        $ferie[$annee.'-08-15'] = "Assomption";
        $ferie[$annee.'-11-01'] = "Toussaint";
        $ferie[$annee.'-11-11'] = "Armistice 14-18";
        $ferie[$annee.'-12-25'] = "Noël";

        $paque = easter_date($annee);
        // quelques fetes mobiles
        $ferie[
            $annee.'-'.
            str_pad(date( "n", $paque+1*$jour), 2,'0', STR_PAD_LEFT).'-'.
            str_pad(date( "j", $paque+1*$jour), 2,'0', STR_PAD_LEFT)]     = "Lundi de Pâque";
        $ferie[
            $annee.'-'.
            str_pad(date( "n", $paque+39*$jour), 2,'0', STR_PAD_LEFT).'-'.
            str_pad(date( "j", $paque+39*$jour), 2,'0', STR_PAD_LEFT)]    = "Jeudi de l'Ascension";
        $ferie[
            $annee.'-'.
            str_pad(date( "n", $paque+50*$jour), 2,'0', STR_PAD_LEFT).'-'.
            str_pad(date( "j", $paque+50*$jour), 2,'0', STR_PAD_LEFT)]    = "Lundi de Pentecôte";

        return $ferie;
    }
}
?>

Vous pouvez la télécharger ici : classInfosDates

  1. Toujours utile, je la garde sous le coude !

  2. La vache, très jolie 🙂


  3. function is_date($szDate, $timezone = 'Europe/Paris') {
    $timezone = (!isset($timezone) || !$timezone)? ini_get('date.timezone') : $timezone;
    date_default_timezone_set($timezone);
    $timestamp = strtotime($szDate);
    return (bool) ($timestamp!==false);
    }

    J’aurai fait ça pour is_date(), quitte à retraiter après le résultat.
    Maintenant, DateTime simplifie pas mal les choses, mais php5.3 pour pas mal de méthodes.

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> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>