[RESOLU] Gestion de date en php

Eléphanteau du PHP | 28 Messages

07 août 2017, 03:14

Bonjour,
hier j'avais demander des renseignements pour mettre une date dans une base sql car je ne voulais que le jour et le mois, on m'a donc gentiment donner la réponse de mettre en INT, ce que j'ai fait. Mon INT est sous la forme MM/JJ.
Aujourd'hui ma base étant remplie, j'ai attaquer le programme php pour gérer les données, et pour la date j'ai fais ceci (qui fonctionne) mais je me demandais si une fonction n'existait pas déjà pour remplacer ma longue liste de mois ?
Voici le code de ma fonction :
function donne_date($nombre) {
	$mois = intval($nombre / 100);
	$jour = intval($nombre % 100);
	echo $jour ;
		if ($mois == 1) {
				return ' janvier';
					}
				 elseif ($mois == 2) {
				 	return ' fevrier';				 	
				 }
				 elseif ($mois == 3) {
				 	return ' mars';
				 }
				 elseif ($mois == 4) {
				 	return ' avril';
				 }
				  elseif ($mois == 5) {
				 	return ' mai';
				 }
				  elseif ($mois == 6) {
				 	return ' juin';
				 }
				  elseif ($mois == 7) {
				 	return ' juillet';
				 }
				  elseif ($mois == 8) {
				 	return ' aout';
				 }
				  elseif ($mois == 9) {
				 	return ' septembre';
				 }
				  elseif ($mois == 10) {
				 	return ' octobre';
				 }
				  elseif ($mois == 11) {
				 	return ' novembre';
				 }
				  elseif ($mois == 12) {
				 	return ' decembre';
				 }

}
Merci d'avance

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

07 août 2017, 11:01

Bonjour,

Tu peux faire cela avec un tableau qui contient les mois et une expression régulière pour extraire les centaines :

<?php
echo donne_date('1030');

function donne_date(int $date_mmdd) {
    $mois_fr = array('', 'janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 
                     'août', 'septembre', 'octobre', 'novembre', 'décembre');
    if (!preg_match('`^([0-9]{1,2})([0-9]{2})$`', $date_mmdd, $matches)) return false;
    // $matches[1] contient le jour et $matches[2] contient le mois
    return intval($matches[2]).' '.$mois_fr[intval($matches[1])];
}

La partie un peu complexe est l'expression régulière :

Code : Tout sélectionner

^([0-9]{1,2})([0-9]{2})$

Code : Tout sélectionner

[0-9]{1,2}
veut dire 1 ou 2 chiffres de 0 à 9 (car tes mois peuvent être notés 1 pour janvier et pas forcément 01, notamment ça sera le cas si tu les stockes au format INT en MySQL, le premier 0 va disparaitre car inutile pour un entier).
Et on met cela entre parenthèses pour récupérer cette info dans $matches.

Code : Tout sélectionner

[0-9]{2}
idem que précédemment, sauf qu'on veut récupérer cette fois ci exactement 2 chiffres, les unités et les dizaines.

Code : Tout sélectionner

^...$
Le caractère ^ symbolise le début de ta variable et $ la fin.
Cela veut donc dire qu'il ne doit pas y avoir autre chose que 3 ou 4 chiffres dans ta variable.
Si il n'y en a que 2 ou 5 ou qu'il y a des lettres, alors la fonction doit renvoyer false car ce n'est pas normal.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 28 Messages

07 août 2017, 13:31

merci a toi, en effet ton code a vachement plus de gueule que le mien. Je vais maintenant bien l'étudier (je suis vraiment un gros débutant en php) afin de bien comprendre et savoir me resservir de cette méthode. Merci !

Eléphanteau du PHP | 28 Messages

07 août 2017, 14:27

J'ai une question : pourquoi dans ton array avec les dates tu mets un ' ' avant 'janvier" que tu n'attaque pas direct avec 'janvier' ?

Mammouth du PHP | 2703 Messages

07 août 2017, 14:32

le premier élément d'un tableau est à la position 0. si c'est janvier, l'expression régulière va retourner 1 donc la seconde position du tableau.

Eléphanteau du PHP | 28 Messages

07 août 2017, 17:59

Oki merci beaucoup de la réponse.