Quelques petites manipulations avec les dates (PHP/MySQL)

1 message   •   Page 1 sur 1
Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 sept. 2005, 16:29

1 - Obtenir la date du jour
2 - Obtenir une date en Français (libellés du jour et du mois)
3 - Passer une date SQL au format français
4 - Calculer un écart
5 - Obtenir une date dans le futur/le passé
6 - Obtenir le jour de la semaine d'une date précise
7 - Obtenir le numéro de la semaine correspondant à la date courante
8 - Obtenir le premier jour de la première semaine de l'année
9 - Un jour est-il férié en France ?
10 - Convertir une date dans un format particulier dans un autre

:idea: Beaucoup d'autres fonctions PHP ou MySQL sont disponibles, pensez à regarder dans la documentation :
les fonctions de Date/heure PHP
les fonctions de dates et d'heures MySQL

1 - Obtenir la date du jour

avec PHP :
<?php
// seulement la date
$dateDuJour = date('d/m/Y');

// la date et l'heure
$dateDuJour = date('d/m/Y H:i:s');
?>
avec MySQL :

Code : Tout sélectionner

# seulement la date SELECT CURDATE(); SELECT CURRENT_DATE; # la date et l'heure SELECT NOW(); SELECT CURRENT_TIMESTAMP();
2 - Obtenir une date en Français (libellés du jour et du mois)
<?php
function date_fr($time='') {
	$tabJours = Array(0=>'dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi');
	$tabMois = Array(1=>'janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre');
	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
3 - 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.

avec PHP :
$dateSQL = '2005-09-01';
list($annee, $mois, $jour) = explode("-", $dateSQL); 
$dateFR = $jour.'/'.$mois.'/'.$annee;
avec MySQL :

Code : Tout sélectionner

SELECT DATE_FORMAT(champ_date,'%d/%m/%Y') FROM table;

4 - Calculer un écart

avec PHP :
<?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';
?>
avec MySQL :

Code : Tout sélectionner

# 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

5 - Obtenir une date dans le futur/le passé

avec PHP :
<?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;
?>
avec MySQL :

Code : Tout sélectionner

SELECT DATE_ADD(NOW(),INTERVAL 5 DAY); # le futur SELECT DATE_SUB(NOW(), INTERVAL 5 DAY); # le passé

6 - Obtenir le jour de la semaine d'une date précise

avec PHP :
<?php
$time = time();
// en anglais
$jour = date('l', $time);

// en français
$jours = Array('Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi');
$numJour = date('w', $time);
$jour = $jours[$numJour];
?>
avec MySQL (dimanche=1) :

Code : Tout sélectionner

mysql> SELECT DAYOFWEEK('2011-12-27'); +-------------------------+ | DAYOFWEEK('2011-12-27') | +-------------------------+ | 3 | +-------------------------+ 1 row in set (0.00 sec)
7 - Obtenir le numéro de la semaine correspondant à la date courante
Côté MySQL, on peut utiliser la fonction WEEK() (voir la documentation)
Par contre, cette fonction prend en deuxième paramètre un entier, qui va influer sur le nombre renvoyé.

D'après les critères de calcul énoncés ici : http://fr.wikipedia.org/wiki/Semaine (ou là pour le détail : http://fr.wikipedia.org/wiki/ISO_8601#N ... de_semaine)
L'organisation internationale de normalisation (ISO) a émis les recommandations suivantes :

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 :

Code : Tout sélectionner

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) :

Code : Tout sélectionner

mysql> SELECT WEEK(NOW(), 3); +----------------+ | WEEK(NOW(), 3) | +----------------+ | 43 | +----------------+ 1 row in set (0.00 sec)
8 - Obtenir le premier jour de la première semaine 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].', le premier jour de la première semaine de l\'année est donc le lundi '.$datePremierJour.'.';
}

for($i=2000;$i<=2012;$i++) {
        premierJourDeLannee($i);
        echo '<br />';
}
?>
Résultat :
Le 1er janvier 2000 est un samedi, le premier jour de la première semaine de l'année est donc le lundi 03/01/2000.
Le 1er janvier 2001 est un lundi, le premier jour de la première semaine de l'année est donc le lundi 01/01/2001.
Le 1er janvier 2002 est un mardi, le premier jour de la première semaine de l'année est donc le lundi 31/12/2001.
Le 1er janvier 2003 est un mercredi, le premier jour de la première semaine de l'année est donc le lundi 30/12/2002.
Le 1er janvier 2004 est un jeudi, le premier jour de la première semaine de l'année est donc le lundi 29/12/2003.
Le 1er janvier 2005 est un samedi, le premier jour de la première semaine de l'année est donc le lundi 03/01/2005.
Le 1er janvier 2006 est un dimanche, le premier jour de la première semaine de l'année est donc le lundi 02/01/2006.
Le 1er janvier 2007 est un lundi, le premier jour de la première semaine de l'année est donc le lundi 01/01/2007.
Le 1er janvier 2008 est un mardi, le premier jour de la première semaine de l'année est donc le lundi 31/12/2007.
Le 1er janvier 2009 est un jeudi, le premier jour de la première semaine de l'année est donc le lundi 29/12/2008.
Le 1er janvier 2010 est un vendredi, le premier jour de la première semaine de l'année est donc le lundi 04/01/2010.
Le 1er janvier 2011 est un samedi, le premier jour de la première semaine de l'année est donc le lundi 03/01/2011.
Le 1er janvier 2012 est un dimanche, le premier jour de la première semaine de l'année est donc le lundi 02/01/2012.
9 - Un jour est-il férié en France (de Zeus)

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;

}

10 - Convertir une date dans un format particulier dans un autre (par @rthur)

Il existe une fonction dédiée pour pouvoir manipuler une date que l'on récupère dans un format particulier où strtotime() ne fonctionnerai pas, par exemple sur le format français 05/02/2015 (5 février 2015) qui malheureusement est noté de la même façon pour le 2 mai 2015 chez les anglosaxons qui placent le mois avant le jour.

Une solution élégante pour résoudre ce soucis est d'utiliser la fonction date_create_from_format() qui permet de préciser justement le format dans lequel est ta date en entrée pour éviter les confusions entre format anglo-saxon et format français entre autre.

Voici un exemple :
<?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

1 message   •   Page 1 sur 1