Une classe de traitement sur les dates

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

Graine de Crapule

Ça y est, le site Graine de Crapule : http://www.grainedecrapule.fr est publié et officiellement ouvert. Un espace privilégié pour nos petites crapules.

Trouvez votre bonheur sur la nouvelle boutique en ligne http://www.grainedecrapule.fr. Un espace privilégié pour nos petites crapules. Des articles originaux qui ne manquent pas de style pour votre plaisir ou pour faire des heureux.

Chaussons bébé en cuir souple, chaussettes,bodys, pyjamas,bonnets, bavoirs…

Lire la suite »

Sortie Ubuntu 8.04 Hardy Heron

Aujourd’hui c’était la sortie de Hardy Heron, je pensais attendre ce week-end pour l’installer, mais un fichu spyware sur mon windows XP m’en a dissuadé.

Du coup, je glisse le CD de Ubuntu dans mon lecteur, et demarre la machine dessus, il me propose plusieurs choix, mais je prends directement celui : Installer, pas de dual boot, pas de live CD, pas de regrets, Bye Windows, on s’entendaient bien, mais parfois tu as besoins d’un bon dégraissage.

Un peu de mal à reprendre mes marque, cela ne fait pas longtemps que je joue avec linux, mais j’arrive petit à petit à m’en sortir, en tout cas une chose appréciable, je n’ai pas besoin de jouer avec la recherche de drivers.

Ne pas s’enerver, ne pas s’enerver

Les systèmes de campagnes e-mailing parfois quelle plaie, hier j’ai été obligé de menacer pour que ma désinscription puisse être effective.

Pour la petite histoire, cela fait à peu près une semaine que j’essaie de de désinscrire à une newsletter un peu trop envahissante à mon goût : au moins un mail par jour, d’accord au départ je m’étais inscrit dessus intéressé par un service qu’ils proposaient, mais autant s’inscrire fus facile, autant se désinscrire fus plus difficile.

Lire la suite »

Plans de cours sur « mesure »

Ou comment prendre un formateur pour une cruche.

Appréciant beaucoup la formation, mais n’ayant plus autant l’occasion de pratiquer que je ne souhaiterais, ma déception fus grande de « perdre » un client. Pour la petite histoire, j’ai été contacté en début d’année pour établir un plan de cours sur mesure pour le webmaster d’une petite société. Prenant contact avec ce dernier afin d’évaluer son niveau et de préparer un cours correspondant à ses besoin.

Lire la suite »