Général

Les PCRE

Les POSIX

Pratique

Spécial php

Les billets de fred

Date MySQL en francais Posté par Fabrice Lezoray

Cette expression regulière vous permettra de fomater une date venant de MySQL (ou autre) dans un format francais. La date d'entrée peut être soit un Timestamp UNIX, soit une date au format DATE de MySQL (YYYY-MM-DD) ou soit une date au format DATETIME de MySQL (YYYY-MM-DD HH-MM-SS). La date de sortie est au format francais DD-MM-YYYY (HH-MM-SS).

<?php

// Format datetime
$date ='2002-12-25 16:00:00';

// Format date
// $date = '2003-12-25';

// Un timestamp
// $date = time();

function callback_date($match) {

if(is_numeric($match[1]))
return date('d-m-Y H:i:s', $match[1]);
else
return $match[4] . '-' . $match[3] . '-' . $match[2] . $match[5];

}

echo preg_replace_callback('`^(\d+|(\d{4})-(\d{2})-(\d{2})(.*))$`', 'callback_date', $date);

?>
Formater une date Posté par Frédéric Bouchery

Dans les expressions pour formater une date, j'utilise ereg_replace. Pour info, une solution est aussi donnée avec explode.

<?php
//--- avec ereg_replace ---//
$date='2003-05-20';
echo ereg_replace( '([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})', '\\3/\\2/\\1', $date);

//--- sans regex avec explode ---//

$date='2003-05-20';
list( $année, $mois, $jour ) = explode( '-', $date );
echo $jour, '/', $mois, '/', $année;

?>
Vérifie la validité d'une date Posté par Yves Maistriaux

On vérifie dans une chaine et on accepte les dates en français sous cette forme : 03/05/2003 03/05/2003 14:58 03/05/2003 14:58:59 Pour la date en anglais, on inverse la première partie de la regex pour obtenir MM/DD/YYYY On peut encore créer des masques supplémentaires pour réaliser contrôler sur d'autres formes.

<?php
date="03/05/2003 14:58:27";

if(!preg_match('`^(((0[1-9])|(1\d)|(2\d)|(3[0-1]))\/((0[1-9])|(1[0-2]))\/(\d{4})(((([[:space:]]?)(([0-1][0-9])|([2][0-3]))(:[0-5][0-9]))((:[0-5][0-9])?))?))$`',$date1))
{
echo 'pas bon';
}
else
{
echo 'la date est '.$date1;
}

?>
Formater une date (V1) Posté par Yves Maistriaux

Deux fonctions, ereg et preg_match, pour un résultat identique. De nouveau, une regex n'est pas forcément nécessaire pour obtenir le résultat voulu. Une version avec substr est fournie en complément d'information.

<?php
//--- avec ereg ---//

$date="2003-05-20";
ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs);
echo "$regs[3]/$regs[2]/$regs[1]";

// avec preg_match maintenant ---//

$date="2003-05-20";
preg_match ('`(\d{4})-(\d{1,2})-(\d{1,2})`', $date, $out);
echo "$out[3]/$out[2]/$out[1]";

//--- pour info le même résultat avec substr

$date="2003-05-20";
$an=substr($date,0,4);
$mois=substr($date,5,2);
$jour=substr($date,8,2);
echo $jour.'/'.$mois.'/'.$an;

?>
Saisie de date Posté par Frédéric Bouchery

Pour proposer à vos utilisateur une saisie de date sans trop de contraite, voici deux fonctions TRES tolérantes. On peut commencer par "le" avec la date puis "à" et l'heure. Si on ne saisie pas le mois et/ou l'année, il fait le rapprochement par rapport à la date du jour. C'est à dire, si l'on saisie "le 3" alors que nous le 5 novembre, il déduit que l'on parle du 3 décembre. D'ailleurs, on peut saisir les mois en toutes lettres ...

<?php
function checkDateTime($date)
{
list($day, $month, $year) = explode(',', date('d,m,Y'));
static $month_fr = array(1 => 'janvier', 'f[ée]vrier', 'mars', 'avril', 'mai', 'juin', 'juillet', 'ao[ûu]t', 'septembre', 'octobre', 'novembre', 'd[ée]cembre');

if (preg_match('`^ *(le +)?([0-3]?[0-9])( *[-/ ] *(([0-1]?[0-9])|(' . implode('|' , $month_fr) . '))( *[-/ ] *([0-9]{1,4}))?)? +([aà] +)?([0-2]?[0-9]) *[:h] *([0-5][0-9]) *$`i', $date, $match)) {
if (empty($match[4])) {
if ($match[2] > $day) $match[4] = $month;
elseif ($month == 12) $match[4] = 1;
else $match[4] = $month + 1;
}

if (!empty($match[6])) {
foreach($month_fr as $month_value => $mask) {
if (preg_match('`' . $mask . '`i', $match[4])) {
$match[4] = $month_value;
break;
}
}
}

if (empty($match[8])) {
if ($match[4] > $month) $match[8] = $year;
else $match[8] = $year + 1;
}
print_r($match);
if (checkdate($match[4], $match[2], $match[8])) {
if ($match[10] < 24 and $match[11] < 60) return $match[8] . '-' . $match[4] . '-' . $match[2] . ' ' . $match[10] . ':' . $match[11] . ':00';
}
}
return false;
}

function checkDateOnly($date)
{
list($day, $month, $year) = explode(',', date('d,m,Y'));
static $month_fr = array(1 => 'janvier', 'f[ée]vrier', 'mars', 'avril', 'mai', 'juin', 'juillet', 'ao[ûu]t', 'septembre', 'octobre', 'novembre', 'd[ée]cembre');

if (preg_match('`^ *(le +)?([0-3]?[0-9])( *[-/ ] *(([0-1]?[0-9])|(' . implode('|' , $month_fr) . '))( *[-/ ] *([0-9]{1,4}))?)? *$`i', $date, $match)) {
if (empty($match[4])) {
if ($match[2] > $day) $match[4] = $month;
elseif ($month == 12) $match[4] = 1;
else $match[4] = $month + 1;
}

if (!empty($match[6])) {
foreach($month_fr as $month_value => $mask) {
if (preg_match('`' . $mask . '`i', $match[4])) {
$match[4] = $month_value;
break;
}
}
}

if (empty($match[8])) {
if ($match[4] > $month) $match[8] = $year;
else $match[8] = $year + 1;
}
print_r($match);
if (checkdate($match[4], $match[2], $match[8])) {
return $match[8] . '-' . $match[4] . '-' . $match[2];
}
}
return false;
}

?>
Et encore un formatage de date... Posté par Yves Maistriaux

Une autre approche avec preg_replace en utilisant le délimiteur de classe \d (chiffres uniquement)

<?php
$madate="2003-06-19";
$motif='`(\d{4})-(\d{1,2})-(\d{1,2})`';
$afficher='$3-$2-$1';
echo preg_replace($motif,$afficher,$madate);

// pour info, sans regex avec explode

$madate=explode('-',$madate);
echo $madate[2].'-'.$madate[1].'-'.$madate[0];
?>
Fonction pour une date en français... Posté par Yves Maistriaux

Un autre regex de formatage de date en français avec utilisation d'une fonction, d'un tableau, de substr...

<?php
$date="2003-09-08";

function date_francais($date){
preg_match ('`^(\d{4})-(\d{2})-(\d{2})(.*)$`', $date, $out);
if($out[2]<10){$out[2]=substr($out[2],1,1);}
$i=$out[2];
$mois = array('','janvier', 'fevrier', 'mars', 'avril', 'mai','juin','juillet', 'aout', 'septembre', 'octobre','novembre', 'decembre');
return $out[3].' '.$mois[$i].' '.$out[1].' '.$out[4];
}
echo 'Fonction date en français : Nous sommes le ',date_francais($date);
?>
Un affichage simplisime Posté par Yves Maistriaux

Grâce à strftime() et setlocale(), voilà un affichage simplisime de la date en français. Vraiment archi simple.

<?php
setlocale(LC_TIME, 'french');
echo strftime('Nous sommes le %A %d %B %Y, il est %Hh%M', time() );
?>
Les samedis du mois Posté par Yves Maistriaux

Petite portion permettant de déterminer les dates des samedis d'un mois et d'une année donnée. Exemple : mois = 1 et année = 2006 donnera les dates des samedi du mois de janvier 2006.

<?php
$mois=3;
$an=2006;
$nom_mois=
array(
1=>'Janvier',
'Février',
'Mars',
'Avril',
'Mai',
'Juin',
'Juillet',
'Août',
'Septembre',
'Octobre',
'Novembre',
'Décembre'
);
$nbj=date("t", mktime(0,0,0,$mois, 1, $an));

$samedi = 7 - date("w", mktime(0,0,0,$mois, 1, $an)); //Dimanche au samedi 1 à 7
$nbsam=round($nbj/7);
for($i=0;$i<=$nbsam;$i++)
{
if($samedi + 7*$i<=$nbj){
$sam_mois[]=$samedi + 7*$i;
}
}
echo 'Les samedi du mois de ',$nom_mois[$mois],' ',$an,' sont :<pre>';
print_r($sam_mois);
echo '</pre>';
?>
Affichage du jour de la semaine Posté par Yves Maistriaux

Un affichage simple du jour de la semaine.

<?php
$date=time();

function semaine($date)
{
$jour=date("z",$date);
$num_sem=($jour/7)+1;
$num=intval($num_sem);
return $num
}
echo semaine($date);
?>
Une date en français Posté par Yves Maistriaux

Une méthode pour un affichage de date en français. Il existe d'autres fonctions qui permet de le faire facilement, mais il est intéressant de voir comment fonctionne les array() et option de date en php.

<?php
//--- DATE DU JOUR EN FRANCAIS ---//
//
$date1=time(now);
$date=getdate($date1);
function date_francais($date){
//--- Les noms de jours en Francais
$jour = array('dimanche','lundi','mardi','mercredi','jeudi','vendredi','samedi');
//--- Les noms de mois en Francais
$mois = array(1=>'janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre');

//--- le jour en français
$jourfr=$jour[$date['wday']];
//--- si vous souhaitez une majuscule pour le jour, activez la ligne ci-dessous
//$jourfr=ucfirst($jourfr);
//--- le jour en chiffre
$jour = $date['mday'];
//--- le mois en chiffre
$mois_cf = $date['mon'];
//--- le mois en français
$moisfr = $mois[$mois_cf] ;
//--- si vous souhaitez une majuscule pour le mois, activez la ligne ci-dessous
//$moisfr=ucfirst($moisfr);
//--- l'annee`
$annee = $date['year'];
//--- la date complète en français
$date_en_francais = "Nous sommes le $jourfr $jour $moisfr $annee.";
return $date_en_francais;
}
//--- Affichage ---//
echo date_francais($date);
//
//--- DATE EN FRANCAIS D'UN TIMESTAMP RECUPERER DANS UNE TABLE ---//
//--- peut utiliser le timestamp s'il est fourni ---//
//--- exemple : $date1="1034845105";
//--- la variable $date devient : $date=getdate($date1);
//--- la fonction ne change pas
?>
Est-ce une année bissextile ? Posté par Yves Maistriaux

Plusieurs tests simples pour savoir si une année est bissextile.

<?php
// test 1
function bissextile($annee){
return checkdate(2,29,$annee);
}

// test 2
$an='2006';

if ($an % 4 == 0 && ($an % 100 != 0 || $an % 400 == 0))
{
echo 'bissextile';
}
else
{
echo 'pas bissextile';
}

// test 3
function bissextile($annee)
{
return (($annee % 4 == 0) && ($annee % 100 != 0 || $annee % 400 == 0));
}
echo bissextile($an);
?>
Dans X jours nous serons le... Posté par Yves Maistriaux

Une petite portion très simple permettant de connaître une date dans le futur.

<?php
$nb_jours = 10;
$madate = getdate(($nb_jours*24*3600)+mktime());
// $madate retourne un array
echo 'Dans ',$nb_jours,' jours nous serons le :
',$madate['mday'],'/',$madate['mon'],'/',$madate['year'];

?>
Dans X jours nous serons le... Version 2 Posté par Yves Maistriaux

La même que la précédente, mais ici on s'amuse avec une fonction. J'y ai ajouté la notion de d'époque "futur ou passé" symboliser respectivement par le signe + ou - Le texte est bien évidemment adapté en sortie

<?php
function Xjours($sign_tmp,$nb_jours)
{
if($sign_tmp=='+'){
$madate = getdate(mktime()+($nb_jours*24*3600));
$sortie='Dans '.$nb_jours.' jours nous serons le : ';
}
else
{
$madate = getdate(mktime()-($nb_jours*24*3600));
$sortie='Il y a '.$nb_jours.' jours nous étions le : ';
}
return $sortie.' '.$madate['mday'].'/'.$madate['mon'].'/'.$madate['year'];
}
$nbj=1000;
$signe='-';
echo Xjours($signe,$nbj);
?>
Gérer les semaines dans une liste select Posté par Yves Maistriaux

Une petite fonction permettant de gérer un calendrier par semaine dans un formulaire. Affichera une liste de ce genre (pour les 52 semaines bien évidemment):

<?php
echo '<form><select name="mes_semaines">';

$semaine = 60*60*24*7;
$j1 = mktime(0,0,0,date('m'),date('d')-date('w')+1,date('Y'));

for ($i = 0; $i < 52; $i++)
{
echo '<option value="',date('d-m-Y',$j1),'">
du ',date('d-m-y',$j1),' au ',date('d-m-y', $j1 + $semaine),'</option>';

$j1 += $semaine;
}

echo '</select></form>';
?>
Calcul de l'age Posté par Yves Maistriaux

Une petite fonction qui permet de calculer et d'afficher l'âge d'un membre en rapport avec sa date de naissance extraite d'une base de données. La date passée en argument est au format Mysql soit YYYY-MM-DD Les facteurs de multiplication ont été choisi en gardant une certaine logique temporelle, mais vous pouvez en choisir d'autres de manière totalement arbitraire sans que cela ne gêne le calcul. Cette fonction est bien évidement adaptable à vos diverses situations

<?php
function age($ladate) {
$madate = explode('-',$ladate);

$j = 86400; //sec par jour
$m = 86400*30; // sec par mois (30 est un choix arbitraire)
$an = 86400*365.25; // sec par an

$madate_sec = $madate[0]*$an + $madate[1]*$m + $madate[2]*$j;
$today_sec = date('Y')*$an + date('m')*$m + date('d')*$j;

$age = floor(($today_sec-$madate_sec)/$an);

return $age;
}
$date='1959-04-12';
echo age($date);
?>
Trouver le jour... Posté par Yves Maistriaux

Petite fonction permettant de retourner le jour précis d'une semaine et d'une année au départ du nom du jour. Donc 3 arguments : - nom du jour - numéro de la semaine - année

<?php
function monjour($jour,$sem,$an)
{
$nom_jour=array('lundi','mardi','mercredi','jeudi','vendredi','samedi','dimanche');
$jj=array_search($jour,$nom_jour);

$an = date('Y');
$j_deb = ((($sem-1)*7)+8)-6;

return date('d-m-Y',mktime(0,0,0,1,$j_deb+$jj,$an));
}

echo monjour('mardi',31,2006);
?>
Nombre de jours entre deux dates Posté par Yves Maistriaux

Fonction librement inspirée d'une source "facteur de date" de Rémy BAEGERT. Exprime en jours la différence qu'il existe entre deux dates données.

<?php
function facteur_date($date_entree)
{
$date=explode('-',$date_entree);
$an=365*$date[2];
$m=31*($date[1]-1);
if (($date[1]==1) || ($date[1]==2))
{
$d= 0;
$e = intval(($date[2] -1)/4);
$h = intval(0.75*(intval(($date[2]-1)/100)+1));
}
else
{
$d= intval(0.4*$date[1]+2.3);
$e = intval($date[2]/4);
$h = intval(0.75*(intval($date[2]/100)+1));
}
$resultat = $date[0] + $an+ $m - $d +$e -$h;

return $resultat;
}

function diff_dates($date1,$date2)
{
$diff = facteur_date($date2)-facteur_date($date1);
return $diff;
}
$datedeb='10-1-2005';
$datefin='1-1-2100';
echo diff_dates($datedeb,$datefin);
?>
Une image... du jour Posté par Yves Maistriaux

Un système simplissime pour afficher une image en fonction du jour de la semaine. Il faudra bien entendu mettre la balise <img src="..." /> dans l'echo

<?php
$imgjour=array(
'image_dimanche',
'image_lundi',
'image_mardi',
'image_mercredi',
'image_jeudi',
'image_vendredi',
'image_samedi'
);
echo $imgjour[date('w')];
?>
N'oblige pas à avoir le zéro en début du jour ou du mois Posté par jy

preg_match('`^(((0[1-9])|([1-9])|(1\d)|(2\d)|(3[0-1]))\/((0[1-9])|([1-9])|(1[0-2]))\/(\d{4}))$`',$date)

ADAM Benjamin 2008 | Admin