-
Quelques petites manipulations avec les dates (PHP/MySQL)
les fonctions de Date/heure PHP - les fonctions de dates et d’heures MySQL
Obtenir la date du jour
PHP :
<?php // seulement la date $dateDuJour = date('d/m/Y'); // la date et l'heure $dateDuJour = date('d/m/Y H:i:s'); ?>
MySQL :
# seulement la date SELECT CURDATE(); SELECT CURRENT_DATE; # la date et l'heure SELECT NOW(); SELECT CURRENT_TIMESTAMP();
Obtenir une date en Français (libellés du jour et du mois)
function date_fr($time='') { $tabJours = Array(0=>'dim', 'lun', 'mar', 'mer', 'jeu', 'ven', 'sam'); $tabMois = Array(1=>'janv', 'fév', 'mar', 'avr', 'mai', 'juin', 'juillet', 'août', 'sept', 'oct', 'nov', 'déc'); if (empty($time)) { $time = time(); } $numJourSemaine = date('w', $time); //numéro du jour de la semaine sans les zéros initiaux $numJourMois = date('j', $time); $numMois = date('n', $time); // numéro du mois sans les zéros initiaux $numAnnee = date('Y', $time); $libelleJour = $tabJours[$numJourSemaine]; $libelleMois = $tabMois[$numMois]; if ($numJourMois == 1) $numJourMois .= 'er'; return $libelleJour.' '.$numJourMois.' '.$libelleMois.' '.$numAnnee; } echo 'Nous sommes le '.date_fr(); $moinsUnAn= mktime(0, 0, 0, date('m'), date('d'), date('Y')-1); echo '<br />'; echo 'Il y a un an nous étions le '.date_fr($moinsUnAn);
Nous sommes le jeudi 15 octobre 2009 Il y a un an nous étions le mercredi 15 octobre 2008
Passer une date SQL au format français
Dans une colonne de type DATE, on a ce format : AAAA-MM-JJ
Ce format est le format ISO (et non anglo-saxon), adopté afin de faciliter les tris. Il est peu judicieux d’adopter un autre type et format (ex : VARCHAR JJMMAAAA) pour stocker des dates, qui prendra plus de place disque et vous posera d’énormes problèmes lors de calculs.
La mise en forme se fait uniquement au moment de la sélection et de l’affichage.PHP :
$dateSQL = '2005-09-01'; list($annee, $mois, $jour) = explode("-", $dateSQL); $dateFR = $jour.'/'.$mois.'/'.$annee;
MySQL :
SELECT DATE_FORMAT(champ_date,'%d/%m/%Y') FROM table;
Calculer un écart
PHP :
$date = Array('annee'=>1982, 'mois'=>05, 'jour'=>01); // la date de départ $aujourdhui = time(); // le timestamp d'aujourd'hui $time = mktime(0, 0, 0, $date['mois'], $date['jour'], $date['annee']); // la date de départ est passée en secondes $ecart = $aujourdhui - $time; // soustraction => nombre de secondes de la différence $ecart = floor($ecart / 3600 / 24); // on repasse en nombre de jours echo $ecart.' jours<br />'; $ecart = floor($ecart / 365); // on repasse en années echo $ecart.' années';
MySQL :
# avant MySQL 4.1 SELECT (UNIX_TIMESTAMP(date_sup) - UNIX_TIMESTAMP(date_inf)) / 3600 / 24 AS ecart FROM <table> # depuis MySQL 4.1 SELECT DATEDIFF(date_debut, date_fin) FROM <table>; # écart entre 2 colonnes de type DATE SELECT TIMEDIFF(time_debut, time_fin) FROM <table>; # écart entre 2 colonnes de type TIME
Obtenir une date dans le futur/le passé
PHP :
$date = Array('annee'=>date('Y'), 'mois'=>date('m'), 'jour'=>date('d')); // vous pouvez aussi obtenir ce tableau avec la fonction getDate() $N = 31; // mktime fait automatiquement le calcul $time = mktime(00, 00, 00, $date['mois'], $date['jour']+$N, $date['annee']); $dansNjours = date('d/m/Y', $time); echo $dansNjours;
MySQL :
SELECT DATE_ADD(NOW(),INTERVAL 5 DAY); # le futur SELECT DATE_SUB(NOW(), INTERVAL 5 DAY); # le passé
Obtenir le jour de la semaine d’une date précise
PHP :
<?php $time = time(); // en anglais $jour = date('l', $time); // en français $jours = Array('Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'); $numJour = date('w', $time); $jour = $jours[$numJour]; ?>
MySQL (dimanche=1) :
mysql> SELECT DAYOFWEEK('2011-12-27'); +-------------------------+ | DAYOFWEEK('2011-12-27') | +-------------------------+ | 3 | +-------------------------+ 1 row in set (0.00 sec)
Obtenir le numéro de la semaine correspondant à la date courante
Côté MySQL, on peut utiliser la fonction WEEK() (documentation) :
1. Le lundi est considéré comme le premier jour de la semaine. (norme ISO 8601 et Académie française[3])
2. Les semaines d’une même année sont numérotées de 01 à 52 (parfois 53).
3. La semaine qui porte le numéro 01 est celle qui contient le premier jeudi de janvier.
4. Il peut exister une semaine n° 53 (années communes finissant un jeudi, bissextiles finissant un jeudi ou un vendredi).C’est le mode numéro 3 que l’on utilisera :
Mode First day of week Range Week 1 is the first week … 3 Monday 1-53 with more than 3 days this year
Ce qui donne (pour le 23/10/2008) :
mysql> SELECT WEEK(NOW(), 3); +----------------+ | WEEK(NOW(), 3) | +----------------+ | 43 | +----------------+ 1 row in set (0.00 sec)
premier jour et premier lundi de l’année
La première semaine de l’année peut commencer l’année précédente, les règles de calculs sont ici : http://fr.wikipedia.org/wiki/Semaine_1
À partir de ces simples règles, il est facile de développer sa propre fonction, ici grâce à un switch() mais on pourrait aussi utiliser un tableau par exemple.<?php function premierJourDeLannee($annee=2010) { $tabLibellesJours = Array(0=>'dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'); $premierJanvier = date("w", mktime(0, 0, 0, 1, 1, $annee)); $timePremierJour = null; switch ($premierJanvier) { case 4: // jeudi $timePremierJour = mktime(0, 0, 0, 12, 29, $annee-1); break; case 3: // mercredi $timePremierJour = mktime(0, 0, 0, 12,30, $annee-1); break; case 2: // mardi $timePremierJour = mktime(0, 0, 0, 12, 31, $annee-1); break; case 1: // lundi $timePremierJour = mktime(0, 0, 0, 1, 1, $annee); // premier janvier = premier jour de l'année break; case 0: // dimanche $timePremierJour = mktime(0, 0, 0, 1, 2, $annee); break; case 6: // samedi $timePremierJour = mktime(0, 0, 0, 1, 3, $annee); break; case 5: // vendredi $timePremierJour = mktime(0, 0, 0, 1, 4, $annee); break; } $datePremierJour = date("d/m/Y", $timePremierJour); echo 'Le 1er janvier '.$annee.' est un '.$tabLibellesJours[$premierJanvier].', premier lundi '.$datePremierJour.'.'; } for($i=2000;$i<=2012;$i++) { premierJourDeLannee($i); echo '<br />'; } ?>
Résultat :
Le 1er janvier 2000 est un samedi, premier lundi 03/01/2000.
Le 1er janvier 2001 est un lundi, premier lundi 01/01/2001.
Le 1er janvier 2002 est un mardi, premier lundi 31/12/2001.
Le 1er janvier 2003 est un mercredi, premier lundi 30/12/2002.
Le 1er janvier 2004 est un jeudi, premier lundi 29/12/2003.
Le 1er janvier 2005 est un samedi, le premier lundi 03/01/2005.
Le 1er janvier 2006 est un dimanche, le premier lundi 02/01/2006.
Le 1er janvier 2007 est un lundi, le premier lundi 01/01/2007.
Le 1er janvier 2008 est un mardi, le premier lundi 31/12/2007.
Le 1er janvier 2009 est un jeudi, le premier lundi 29/12/2008.
Le 1er janvier 2010 est un vendredi, le premier lundi 04/01/2010.
Le 1er janvier 2011 est un samedi, le premier lundi 03/01/2011.
Le 1er janvier 2012 est un dimanche, le premier lundi 02/01/2012.Un jour est-il férié en France
Si le paramètre $weekend vaut true, les weekend (samedi et dimanche) sont considérés comme fériés.
/** * Teste si un jour est férié ou non * Teste si un jour donné tombe un jour férié français, ou éventuellement un week-end * * @param integer $timestamp - Timestamp du jour a tester (entre 00h00 et 23h59) * @param boolean $weekend - Détection des week-end comme jour fériés * @return boolean - TRUE si le jour transmis en férié, FALSE sinon */ function estFerie( $timestamp, $weekend=false ) { // Initialisation de la date de début $jour = date("d", $timestamp); $mois = date("m", $timestamp); $annee = date("Y", $timestamp); // Vérification parmis les jours férié fixes if( ($jour == 1 && $mois == 1) || // 1er Janvier (Jour de l'an) ($jour == 1 && $mois == 5) || // 1er Mai (Fête du travail) ($jour == 8 && $mois == 5) || // 8 Mai (Fête de la victoire - Fin de la seconde guerre mondiale) ($jour == 14 && $mois == 7) || // 14 Juillet (Fête nationale) ($jour == 15 && $mois == 8) || // 15 Aout (Assomption) ($jour == 1 && $mois == 11) || // 1er Novembre (Toussain) ($jour == 11 && $mois == 11) || // 11 Novembre (Armistice 1918) ($jour == 25 && $mois == 12) ) // 25 Décembre (Noël) { return true; } // Si le week-end doit être considéré comme jour férié if( $weekend !== false ) { // Calul des samedis et dimanches $jour_julien = unixtojd($timestamp); $jour_semaine = jddayofweek($jour_julien, 0); //Samedi (6) et dimanche (0) if($jour_semaine == 0 || $jour_semaine == 6) { return true; } } // Calcul du jour de pâques $date_paques = easter_date($annee); $jour_paques = date("d", $date_paques); $mois_paques = date("m", $date_paques); // Si le jour testé est le jour de paques if($jour_paques == $jour && $mois_paques == $mois) { return true; } // Calcul du jour du lundi de pâques $date_lundi_paques = mktime( date("H", $date_paques), date("i", $date_paques), date("s", $date_paques), date("m", $date_paques), date("d", $date_paques) + 1, date("Y", $date_paques)); $jour_lundi_paques = date("d", $date_lundi_paques); $mois_lundi_paques = date("m", $date_lundi_paques); // Si le jour testé est le jour de paques if($jour_lundi_paques == $jour && $mois_lundi_paques == $mois) { return true; } // Calcul du jour de l ascension (39 jours après Paques) $date_ascension = mktime( date("H", $date_paques), date("i", $date_paques), date("s", $date_paques), date("m", $date_paques), date("d", $date_paques) + 39, date("Y", $date_paques)); $jour_ascension = date("d", $date_ascension); $mois_ascension = date("m", $date_ascension); // Si le jour testé est le jour de l'ascension if($jour_ascension == $jour && $mois_ascension == $mois) { return true; } // Calcul de Pentecôte (7 semaines après Paques) $date_pentecote = mktime( date("H", $date_paques), date("i", $date_paques), date("s", $date_paques), date("m", $date_paques), date("d", $date_paques) + 49, date("Y", $date_paques)); $jour_pentecote = date("d", $date_pentecote); $mois_pentecote = date("m", $date_pentecote); // Si le jour testé est le jour de la pentecote if($jour_pentecote == $jour && $mois_pentecote == $mois) { return true; } // Calcul du lundi de Pentecôte (Lendemain de paques) $date_lundi_pentecote = mktime( date("H", $date_pentecote), date("i", $date_pentecote), date("s", $date_pentecote), date("m", $date_pentecote), date("d", $date_pentecote) + 1, date("Y", $date_pentecote)); $jour_lundi_pentecote = date("d", $date_lundi_pentecote); $mois_lundi_pentecote = date("m", $date_lundi_pentecote); // Si le jour testé est le jour de la pentecote if($jour_lundi_pentecote == $jour && $mois_lundi_pentecote == $mois) { return true; } // Si l'execution est parvenue jusque là, c'est que le jour transmis n'est pas férié return false; }
Convertir une date dans un format particulier dans un autre
date_create_from_format() permet de préciser le format dans lequel est ta date en entrée pour éviter les confusions entre format anglo-saxon et format français entre autre.
<?php $date_originale="05/02/2015"; $timestamp_strtotime=strtotime($date_originale); echo date("d M Y", $timestamp_strtotime); // Va renvoyer le 2 mai car par défaut PHP pense que la date est au format américain qui place le mois avant le jour $timestamp_datecreatefromformat = date_create_from_format('d/m/Y', $date_originale); echo date_format($timestamp_datecreatefromformat, "d M Y"); // Va renvoyer le 5 février