phpInfo.netLes ArchivesLes éléPHPants

  
  Accueil
  Trucs & Astuces
  Scripts
  Regex
  Annuaire
  Articles

.
      
 Astuces   PHP  Date/Heure


Calcul automatique de l'âge[04-07-2002]
Posté par Patrice HARDOUIN

Combien de fois ai-je vu des camarades se prendre la tête pour remettre à jour leur CV en ligne le jour de leur anniversaire. Ce petit script (volontairement détaillé) permet de remettre à jour la variable $age contenant l'âge exact de la personne de date de naissance $ddn.

<?php

//à partir de la date de naissance, retourne l'âge dans la variable $age

// date de naissance (partie à modifier)
$ddn = "07/02/1973";

// enregistrement de la date du jour
$DATEDUJOUR = date("Y-m-d");
$DATEFRAN = date("d/m/Y");

// calcul de mon age d'après la date de naissance $ddn
$annais = substr("$ddn", 6, 4);
$anjour = substr("$DATEFRAN", 6, 4);
$moisnais = substr("$ddn", 3, 2);
$moisjour = substr("$DATEFRAN", 3, 2);
$journais = substr("$ddn", 0, 2);
$jourjour = substr("$DATEFRAN", 0, 2);

$age = $anjour-$annais;

if (
$moisjour<$moisnais){$age=$age-1;}

if (
$jourjour<$journais && $moisjour==$moisnais){$age=$age-1;}

?>


[6 commentaires]

Calculer une date dans le futur[30-06-2002]
Posté par Djassper

Cette fonction vous permet de calculer une date dans le futur (dans un certain nombre de jours) à partir de la date du jour ou d'une date donnée au format MySQL (YYYY-MM-DD). Il suffit de fournir le nombre de jours en paramètre :

$DateDansDixJours=DateInXDays(10);

Cette fonction est par exemple utile pour écrire des dates de fin d'abonnement dans une base de donnée.

<?php
function DateInXDays($X,$FromDate='')
{
    if(
$FromDate=='')
        
$MyDate = explode('-',date('Y-m-d'));
    else
        
$MyDate = explode('-',$FromDate);
    
    
$XDate = getdate(mktime(0,0,0,$MyDate[1],$MyDate[2]+$X,$MyDate[0]));

    return(
$XDate['year'].'-'.sprintf('%02d', $XDate['mon']).'-'.
           
sprintf('%02d', $XDate['mday']));
}
?>


[1 commentaire]

Conversion date formulaire -> date MySQL[30-06-2002]
Posté par thibs200

<?php
    
function form_to_db($date, $delimiter = '.')
{
  if (
ereg("([0-9]{1,2})$delimiter([0-9]{1,2})$delimiter([0-9]{2,4})",
      
$date, $regs))
  {
    if(
strlen($regs[1]) <2) $regs[1] = "0$regs[1]";
    if(
strlen($regs[2]) <2) $regs[2] = "0$regs[2]";
    if(
strlen($regs[3]) <4) $regs[3] = "20$regs[3]";

    return
"$regs[3]$regs[2]$regs[1]";
  }
  else
  {
    return
false;
  }
}

echo
form_to_db($date_from_form, '-');

?>


Conversion dune date aaaammjj -> jj/mm/aaaa[30-06-2002]
Posté par Thibs200

Pour convertir une date venant d'une base MySQL grâce à une fonction :

<?php

function db_to_form($date, $delimiter='/')
{
      
$d = array();

      
$d[day] = substr($date, 6, 2);
      
$d[month] = substr($date, 4, 2);
      
$d[year] = substr($date, 0, 4);

      return
$d[day].$delimiter.$d[month].$delimiter.$d[year];
}

$req = 'requete sql';
$req1 = mysql_query($req) or die (mysql_error());

$row = mysql_fetch_object($req1);
$affdatedeb = $row->datedeb;

echo
db_to_form($affdatedeb, '/');

?>


Conversion secondes -> h:m:s[30-06-2002]
Posté par Alexis

Voici une petite fonction pour convertir un nombre de secondes en son équivalent heure:minute:seconde.

<?php
function calcul_hours($temps)
{
  
//combien d'heures ?
  
$hours = floor($temps / 3600);

  
//combien de minutes ?
  
$min = floor(($temps - ($hours * 3600)) / 60);
  if (
$min < 10)
    
$min = "0".$min;

  
//combien de secondes
  
$sec = $temps - ($hours * 3600) - ($min * 60);
  if (
$sec < 10)
    
$sec = "0".$sec;
        
  echo
$hours."h".$min."m".$sec."s";
}
?>

Exemple d'utilisation :

<?php
calcul_hours
(3600); //Renverra : 1h00m00s
?>


[2 commentaires]

Vérification de l'existence d'une date[30-06-2002]
Posté par ckoco

<?php
function isDate($date)
{
  list(
$d, $m, $y) = split('[/.-]', $date);
  
$dummy = date("d/m/Y", mktime (0,0,0,$m,$d,$y));
  
$date = ereg_replace('-', '/', $date);
  if (
$dummy != $date)
    return
false;
  else
    return
true;
}

isDate("29-02-2002"); // ==> false
isDate("28-02-2002"); // ==> true
?>


[2 commentaires]

Transformer une date MySQL en Français écrit[19-06-2002]
Posté par Djassper

Avec la fonction suivante vous allez pouvoir transformer une date au format MySQL : 2002-06-11 en : Mardi 11 Juin 2002.
En option vous pouvez choisir de ne pas afficher le jour de la semaine et/ou l'année.

Exemple, pour afficher la date du jour sur votre site utilisez le code suivant :

<?php

echo MySQLDateToExplicitDate(date('Y-m-d'));

Function
MySQLDateToExplicitDate($MyDate, $WeekDayOn=1, $YearOn=1)
{
  
$MyMonths = array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin",
        
"Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre");
  
$MyDays = array("Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi",
                  
"Vendredi", "Samedi");

  
$DF=explode('-',$MyDate);
  
$TheDay=getdate(mktime(0,0,0,$DF[1],$DF[2],$DF[0]));

  
$MyDate=$DF[2]." ".$MyMonths[$DF[1]-1];
  if(
$WeekDayOn){$MyDate=$MyDays[$TheDay["wday"]]." ".$MyDate;}
  if(
$YearOn){$MyDate.=" ".$DF[0];}
        
  return
$MyDate;
}
?>


[1 commentaire]

Un Timer en PHP[03-06-2002]
Posté par CalistX

Un timer sert à exécuter une fonction au bout de X secondes par exemple. Cela sert également dans ce cas-là à mettre en "veille" le script.

Voilà donc la fonction :

<?php

function Timer($time, $function)
{
    
$tmp_time = time();
    
$i = $tmp_time;
    
$time = $tmp_time + $time;
    while (
$i < $time)
    {
        If (
time() != $i) { $i++; }
    }
    
$function();
}

// La syntaxe :
Timer(secondes, fonciton à appeler aprés les secondes)

?>


[3 commentaires]

Analyse d'une date SQL[15-03-2002]
Posté par Rénald

<?php

// Exemple de requête
$SQL        = "SELECT NOW()";
$Query      = mysql_query($SQL, $Conn);
list(
$date) = mysql_fetch_row($Query);

// L'astuce est ici
sscanf($date, "%4s-%2s-%2s %2s:%2s:%2s",
        &
$date_Y, &$date_m, &$date_d,
        &
$date_H, &$date_i, &$date_s);

/*
* $date_Y contient l'année
* $date_m contient le mois
* $date_d contient le jour
* $date_H contient l'heure
* $date_i contient les minutes
* $date_s contient les secondes
*
*/

// Vous êtes content
echo 'Youpie !';
?>


[1 commentaire]

Formatage de date et traduction[15-03-2002]
Posté par ptitoine

<?php
function formatdate($date,$format = 'l d F Y @ H:i')
{
    for (
$n = 0; $n <= strlen($format); $n++ )
    {
        switch(
$format[$n])
        {
        case
' ':
            
$dateformat .= ' ';
            break;
        case
'l': // jour format complet
            
$in = array('|Monday|', '|Tuesday|', '|Wednesday|',
                        
'|Thursday|', '|Friday|', '|Saturday|',
                        
'|Sunday|');
            
$out = array('Lundi', 'Mardi', 'Mercredi', 'Jeudi',
                         
'Vendredi', 'Samedi', 'Dimanche' );
            
$dateformat .= preg_replace($in,$out,date($format[$n],$date));
            break;                  
        case
'D': // jour format 3
            
$in = array('|Mon|', '|Tue|', '|Wed|', '|Thu|', '|Fri|',
                        
'|Sat|', '|Sun|');
            
$out = array('Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam', 'Dim');
            
$dateformat .= preg_replace($in,$out,date($format[$n],$date));
            break;
        case
'F': // mois format complet
            
$in = array('|January|', '|February|', '|March|', '|April|',
                        
'|May|', '|June|', '|July|', '|August|',
                        
'|September|', '|October|', '|November|',
                        
'|December|' );
            
$out = array('Janvier', 'Février', 'Mars', 'Avril', 'Mai',
                         
'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre',
                         
'Novembre', 'Décembre');
            
$dateformat .= preg_replace($in,$out,date($format[$n],$date));
            break;
        case
'M': // mois format 3
            
$in = array('|Jan|', '|Feb|', '|Mar|', '|Apr|', '|May|',
                        
'|Jun|', '|Jul|', '|Aug|', '|Sep|', '|Oct|', '|Nov|',
                        
'|Dec|');
            
$out = array('Jan', 'Fév', 'Mar', 'Avr', 'Mai', 'Jui', 'Jui',
                         
'Aoû', 'Sep', 'Oct','Nov', 'Déc');
            
$dateformat .= preg_replace($in,$out,date($format[$n],$date));
            break;
        default :
            
$dateformat .= date($format[$n],$date);
            break;
        }
    }
    return
$dateformat;
}
?>

L'appel pour afficher la date actuelle par exemple :

$date=formatdate(time(), "votre chaine de formatage"); // applique un formatage perso

ou

$date=formatdate(time()); // applique le formatage par defaut

Année bissextile ?[21-02-2002]
Posté par Vincent

<?
function Bissextile($annee)
{
  return( (
$annee % 4 == 0) &&
          ((
$annee % 100 != 0) || ($annee % 400 == 0)) );
}
?>


Trouver l'age pour une date donnée[17-02-2002]
Posté par z0rglub

La fonction "trouverAge" donne l'age d'une personne dont la date de naissance est donnée dans le paramètre $nais à la date de référence $ref.

Contrat d'utilisation :
- les dates doivent être au format timestamp

Astuces
- utiliser time() comme date de référence pour être à la date actuelle
- utiliser la fonction "mktime" pour passer une date au format timestamp

<?
function trouverAge ($nais, $ref)
{
    
$age = date("Y",$ref) - date("Y",$nais);
    if( (
mktime(0,0,0, date("n", $ref), date("j", $ref), date("Y", $ref)) -
         
mktime(0,0,0, date("n", $nais), date("j", $nais), date("Y", $ref))) < 0 )
    {
        
$age--;
    }
    return
$age;
}
?>


Récupérer la date et l'heure à partir d'un champ de bd[30-01-2002]
Posté par LPA

Voici une petite fonction toute simple qui renvoie les différentes valeurs d'un champ DateTime dans un tableau associatif.

Amusez-vous avec :

<?php
function DateTimeMyInSQL($enreg)
{
    list(
$date,$heure) = explode(" ",$enreg);
    list(
$year,$month,$day) = explode("-",$date);
    list(
$hour,$min,$sec) = explode(":",$heure);
    
$tablo = array (
        
"Heure"=>$hour,
        
"Minute"=>$min,
        
"Seconde"=>$sec,
        
"Jour"=>$day,
        
"Mois"=>$month,
        
"Annee"=>$year
    
);
    return
$tablo;
}

//Pour l'utliser c'est tout simple :
$datetablo=DateTimeMyInSQL($row["date"]);

//Pour afficher le jour
echo $datetablo['Jour'];

//Pour afficher le mois
echo $datetablo['Mois'];

//Pour afficher le l'année
echo $datetablo['Année'];

// Pour les heures, c'est le même principe
// ...

?>


La date dans X jours[06-01-2002]
Posté par Yop

Il vous suffit tout simplement de définir la variable $interval en nombre de jours.

<?
$interval
= 100;
$votre_date = getdate(mktime()+($interval*24*3600));
$an = $votre_date[year];
$mois = $votre_date[mon];
$jour = $votre_date[mday];
echo
"dans $interval jours nous serons le : $jour - $mois - $an";
?>


Correction virtuelle des dates < 1970[09-12-2001]
Posté par Stéf - KpL ProD

<html>
<head>
<title>Nom du Jour pour une Date inferieur à 1970</title>
</head>
<body bgcolor="#FFFFFF">
<?
// Pour avoir le nom du mois et du jour en français .
if (!setlocale("LC_ALL","french"))
    print(
"Erreur !!!<BR>");

// Date de test - vous la connaissez ???
$jour  = 18;
$mois  = 06;   
$annee = 1944;

// Vérifie la date .
if (checkdate($mois, $jour, $annee))
{
    
// corrige l'année < 1970 .
    
$new_annee = $annee;

    while(
$new_annee<1970)
    
$new_annee +=28;
    
// fin de correction .

    // Crée une date valide avec la nouvelle année.
    
$date = mktime(12,1,0,$mois,$jour,$new_annee);

    
// Affiche le nom du jour, le n° du jour et le mois puis insert l'année d'origine.
    
printf("Nous étions le %s %d. quand on a dit :n", strftime("%A %d %B",$date), $annee);
    
printf("<BR>'Les Français parlent aux Français ...'n");
    
printf("<P>Stéphane PEREZ - KpL Prod.n");
}
?>
</form>
</body>
</html>


Conversion TIMESTAMP MySQL[12-03-2001]
Posté par Jacky

Voici une fonction permettant de traduire un TIMESTAMP MySQL en diffrents formats, y compris en TIMESTAMP Unix, utile pour faire des ajouts sur une date. Le format ENG permet la sauvegarde dans un champ MySQL de type Date.

<?
function cvt_date($d_in, $type)
{
  
// Fonction permettant de traduire un timestamp
  // mysql en différents formats.
  
$d = substr($d_in,6,2); // jour
  
$m = substr($d_in,4,2); // mois
  
$y = substr($d_in,0,4); // année

  
switch ($type)
  {
    case
"UNIX":
      
// TIMESTAMP mysql >> TIMESTAMP UNIX
      
return mktime(0,0,0,$m, $d, $y);
      break;

    case
"FR":
      
// TIMESTAMP mysql >> Date format FR
      
return $d."/".$m."/".$y;
      break;

    case
"ENG":
      
// TIMESTAMP mysql >> Date format ENG
      
return $y."/".$m."/".$d;
  }
}
?>


Gestion des semaines[21-01-2001]
Posté par Abdel

Pour afficher dans une boîte de liste de formulaire les semaines sous la forme : 22-01-2001 au 29-01-2001.


<select name=date>
<?
$oneweek
= 60*60*24*7;
$premier_jour = mktime(0,0,0,date("m"),date("d")-date("w")+1,date("Y"));
$d = $premier_jour;

for (
$i = 0; $i < 52; $i++)
{
    echo
"<option value=\"".date("d-m-Y",$d)."\">";
    echo
date("d-m-Y",$d)." au ".date("d-m-Y", $d + $oneweek)."</option>";
    
    
$d += $oneweek;
}
?>
</select>


Connaître le jour du début de la semaine courante[02-01-2001]
Posté par Ben

Oui c'est assez tordu comme devinette mais j'en ai eu besoin pour pouvoir faire des tests.

Donc voici la fonction magique qui retourne le timestamp du jour du début de la semaine :

<?
    
function DebutSmn($time)
    {
        return (
mktime(0,0,0,
                
date('m',$time),
                
date('d',$time)-((date('w',$time)+6)%7),
                
date('Y',$time)));
    }
?>

Utilisation : vous souhaitez exécuter une portion de code (typiquement une mise à jour) toutes les semaines :

<?
    $path
= './test.tmp';
    
$ftime = filemtime($path);
    if (
time() > DebutSmn($ftime)+3600*24*7)
    {
        
job();
        
touch($path);
    }

    echo
'Dernière mise à jour le ', date('d/m/Y à H:i',$ftime);
?>

Je vous avais prévenus que c'était tordu ;)

Date de début d'une semaine[20-12-2000]
Posté par David

Voici une fonction qui vous permettra de connaître la date de début d'une semaine à partir de la date du jour :

<?
function debutsem($n)
{
    
$premier_jour = mktime(0,0,0,date("m"),date("d")-date("w")+1-$n*7,date("Y"));
    
$datedeb = date("m-d-Y", $premier_jour);

    return
$datedeb;
}
?>

Pour la semaine en cours $n = 0, pour la date d'il y à 2 semaines $n = 2.

[1 commentaire]

Compenser le décalage horaire[06-12-2000]

Il est parfois nécessaire quand on fait héberger son site à l'étranger de pouvoir afficher l'heure réelle se son pays plutôt que celle du serveur. Cette exemple montre comment afficher l'heure du serveur + 6h:20mn.

<?
echo date("H:i:s d-m-Y",
          
mktime(date("H") + 6, date("i") + 20, date("s"),
                 
date("m"),     date("d"),      date("Y")));
?>


[1 commentaire]

Le temps à la micro-seconde près[20-11-2000]
Posté par Frédéric Bouchery

La fonction microtime() retourne une chaine du type "msec sec" avec msec en secondes !?!

Cette expression régulière retourne l'heure en secondes dans un format plus utilisable.

<?
$time
= ereg_replace('^0.([0-9]*) ([0-9]*)$','\2.\1',microtime());
?>


Conversion de date[15-11-2000]
Posté par Frédéric Bouchery

Voici une expression régulière pour convertir une date au format MySQL aaaa-mm-jj dans le format jj/mm/aaaa, le tout en une seule ligne :

<?
$date
= ereg_replace('^([0-9]{2,4})-([0-9]{1,2})-([0-9]{1,2})$',
                     
'\3/\2/\1', $date_mysql);
?>


[4 commentaires]

Différence entre 2 dates[21-10-2000]

Cette fonction retourne la différence en nombre de jours entre 2 dates (extrémités incluses) :

<?
// NbJours("2000-10-20", "2000-10-21") retourne 2

function NbJours($debut, $fin) {

  
$tDeb = explode("-", $debut);
  
$tFin = explode("-", $fin);

  
$diff = mktime(0, 0, 0, $tFin[1], $tFin[2], $tFin[0]) -
          
mktime(0, 0, 0, $tDeb[1], $tDeb[2], $tDeb[0]);
  
  return((
$diff / 86400)+1);

}
?>


Afficher simplement un champ DATE de MYSQL[08-10-2000]
Posté par Perrich

<?
// liste des mois
$monthNameArray = array(
  
1 => 'Janvier', 'Février', 'Mars', 'Avril',
  
'Mai', 'Juin', 'Juillet', 'Août', 'Septembre',
  
'Octobre', 'Novembre', 'Décembre' );

// construit une chaine contenant la date passée en paramètre
function displayDate( $dateStr ) {

  global
$monthNameArray;

  
$d = explode( '-',  $dateStr );
  
  if (
$d[1][0] == '0' )
    
$d[1] = substr( $d[1], 1, strlen($d[1]) );

  return (
$d[2].' '.$monthNameArray[$d[1]].' '.$d[0] );
}

// $var est la date d'un champ MySQL et la date apparaît.

echo displayDate( $var );
?>


Dernier jour d'un mois[11-06-2000]

Voici une petite routine qui permet de connaître le dernier jour du mois grâce à la fonction checkdate() qui vérifie la validité d'une date :

<?
   $dernJour
= 28;
   while (
checkdate($mois, $dernJour , $annee))
     
$dernJour++;
   endwhile;
   --
$dernJour;
?>

Il est aussi maintenant possible d'utiliser la fonction date("t") qui donne le nombre de jour d'un mois.

[1 commentaire]

Afficher une date en français[20-05-2000]

Le script ci-dessous permet d'afficher la date courante en français :

<?
  $tMois
= array(
    
"Janvier", "Février", "Mars", "Avril", "Mai",
    
"Juin", "Juillet", "Août", "Septembre",
    
"Octobre", "Novembre", "Décembre");

  
$tJours=array(
    
"Dimanche", "Lundi", "Mardi",
    
"Mercredi", "Jeudi", "Vendredi", "Samedi");

  echo
$tJours[date("w")] ." ";
  echo
date("j").(date("j") == 1 ? "er " : " ");
  echo
$tMois[date("n")-1]." ".date("Y");
?>

Résultats possibles :

  Dimanche 21 mai 2000
Lundi 1er janvier 2001


Ajouter/retirer des jours à une date[20-05-2000]

Pour connaître la date de demain, du mois dernier, ou de l'année prochaine, il faut utiliser les fonctions mktime() et date(). Voici un petit exemple :

<?
if (!isset($date)) {
  
$date = date("d/m/Y");
}

$elts = explode("/", $date);

$jour = $elts[0];
$mois = $elts[1];
$an   = $elts[2];

echo
"<B>Aujourd'hui : $date</B><BR>n";

$demain = mktime(0, 0, 0, $mois, $jour+1, $an);
echo
"Demain : ".date("d/m/Y", $demain)."<BR>n";

$mois_dernier = mktime(0, 0, 0, $mois-1, $jour, $an);
echo
"Mois dernier : ".date("d/m/Y", $mois_dernier)."<BR>n";

$an_prochain = mktime(0, 0, 0, $mois, $jour, $an+1);
echo
"An prochain : ".date("d/m/Y", $an_prochain)."<BR>n";
?>


Synseo