Category Archives: Web

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 »

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 »

Le Web, les entreprises et le reste

Pour mon premier billet sur ce nouveau blog, je vais reprendre un article que j’ai écrit il y a 4 ans, tout en le complétant.

Force est de constater que les entreprises dans leur grande majorité ne savent pas exploiter l’outil Internet. Ces dernières commencent à s’ouvrir à celui-ci. Il est de plus en plus courant pour une entreprise d’avoir son site Internet, malheureusement, comme celles-ci ont un manque flagrant de culture du web, c’est souvent des « ouvrages » désastreux :

  • Ergonomie malheureuse : Nombreux sont les sites développé en Interne, voir par l’ami de… En gros par des personnes à qui il manque les notions d’accessibilité, de facilité d’accès. Ils ne se mettent pas la plupart du temps à la place du visiteur qui est souvent néophyte,
  • Pages mal optimisées : Avec le développement de l’ADSL, les apprentis développeurs « prennent moins de gants » avec le poids de leur page : Animations Flash à tout va, code dix fois trop lourd, images non optimisées,
  • L’usage intensif des dernières technos à la mode : le Web 2.0 (enfin ce qu’ils croient savoir du web 2.0, mais cela, c’est un autre débat), AJAX, …

Lire la suite »