Une classe de traitement sur les dates
Posté dans Ressources, Web
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
Toujours utile, je la garde sous le coude !
La vache, très jolie 🙂
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.