Télécharger
Noter:

Ajouté le 01/04/2020
Visionné 209 fois

Différence entre deux dates en PHP (retourne toutes les infos)

Description

Après la fonction similaire que j'avais sortie il y a quelques années, j'ai décidé de chercher pour en créer une nouvelle moins volumineuse et plus professionnel.


Bug solutionné:
Affichait 'Il y a' au lieu de 'Dans' car:
- depuis $UneDate seulement: 1 = $UneDate est dans le futur, 0 = $UneDate est dans la passé
- interval entre $UneDate et $UneAutre: 0 = $UneDate est dans le futur, 1 = $UneDate est dans la passé



J'ai trouvé la fonction date_diff() qui donne des infos intéressantes!

Pour information, date_diff() retourne:


Pour l'intervalle du 1er mars 2010 au 1er avril 2020:

object(DateInterval)[3]
public 'y' => int 10
public 'm' => int 1
public 'd' => int 0
public 'h' => int 15
public 'i' => int 4
public 's' => int 52
public 'weekday' => int 0
public 'weekday_behavior' => int 0
public 'first_last_day_of' => int 0
public 'invert' => int 1
public 'days' => int 3684
public 'special_type' => int 0
public 'special_amount' => int 0
public 'have_weekday_relative' => int 0
public 'have_special_relative' => int 0

Prenons les valeurs, pour les mettre en valeur!


/*
* A noter qu'il vous faudra configurer le timezone pour afficher la bonne différence, à la minute prés
* Le timzone pour la France:
* date_default_timezone_set("europe/paris");
* A utiliser en haut du document
*/
function differenceDate($UneDate,$UneAutre=false){
//on part du principe que $UneDate et $UneAutre peut être envoyé sous deux formats: un timestamp ou une date formatée

//on vérifie donc le format envoyé, pour le mettre en date formatée si c'est un timestamp:
//is_int vérifie si c'est un nombre entier (un timestamp est un nombre entier)
$UneDate = is_int($UneDate)?date("d-m-Y H:i:s",$UneDate):$UneDate;

//on crée ensuite la date via date_create (Retourne un nouvel objet DateTime (DateTime: Représentation d'une date et heure))
$UneDate = date_create($UneDate);
$maintenant = date_create($UneAutre==false?'now':(is_int($UneAutre)?date("d-m-Y H:i:s",$UneAutre):$UneAutre));

//si jamais la date formatée qui à été envoyée est incorrect, on retourne un message d'erreur
if(!$UneDate){
echo "La date envoyée à differenceDate() est incorrecte.";
return;
}
//date_diff nous donne maintenant des valeurs sur les représentations ci-dessus
$interval = date_diff($maintenant, $UneDate);

//on récupère les valeurs d'$interval qui nous intéresse
$y=$interval->y;//années
$m=$interval->m;//mois
$d=$interval->d;//jours
$h=$interval->h;//heures
$i=$interval->i;//minutes
$s=$interval->s;//secondes
$invert=$interval->invert;//0 = $UneDate est dans le futur, 1 = $UneDate est dans la passé
$texte_invert=$invert==($UneAutre==false?1:0)?'Il y a':'Dans';//il y a une différence lorsqu'on demande un interval ou si on demande "depuis $UneDate seulement":
//depuis $UneDate seulement: 1 = $UneDate est dans le futur, 0 = $UneDate est dans la passé
//interval entre $UneDate et $UneAutre: 0 = $UneDate est dans le futur, 1 = $UneDate est dans la passé
$days=$interval->days;//nombre de jours écoulés (depuis combien ou dans combien, nombre entier positif)

//enfin, on retourne les différences pour les afficher:

//si il y a plus d'un an, on affiche le nombre d'année plus le nombre de jours ("5 ans et 18 jours" par exemple)
if($y>0) $texte="$texte_invert $y an".($y>1?'s':'').($d>0?" et ".$d." jour".($d>1?'s':''):'');
//si il y a moins d'un an, on affiche les mois et les jours ("5 mois et 24 jours" par exemple)
elseif($m>0) $texte="$texte_invert $m mois et $d jour".($d>1?'s':'');
//si il y a moins d'un mois, on affiche les jours, évidemment
elseif($d>0) $texte="$texte_invert $d jour".($d>1?'s':'');
//les heures si il y a moins d'un jour
elseif($h>0) $texte="$texte_invert $h heure".($h>1?'s':'');
//les minutes si il y a moins d'une heure
elseif($i>0) $texte="$texte_invert $i minute".($i>1?'s':'');
// et les secondes si il y a moins d'une minute
elseif($s>0) $texte="$texte_invert $s seconde".($s>1?'s':'');

//si toutes les précédentes valeurs précédentes sont à 0, c'est forcément que c'est maintenant/aujourd'hui (s'affiche seulement si les heures et minutes ne sont pas précisées)
else $texte="C'est aujourd'hui!";

//on retourne un tableau, au moins on pourra afficher la ou les valeurs voulues
return [
'texte'=>$texte,//notre texte formaté du genre "Il y a 5 heures" ou "Dans 1 mois et 12 jours", par exemple
'y'=>$y,
'm'=>$m,
'd'=>$d,
'h'=>$h,
'i'=>$i,
's'=>$s,
'invert'=>$invert,
'texte_invert'=>$texte_invert,
'days'=>$days,
];
}


//utilisation pour afficher la date indiquée jusqu'à maintenant:
$differenceDate = differenceDate("8-5-2120 10:00");
//on peut afficher n'importe quelle valeurs:
//on affiche le texte:
echo "<p>{$differenceDate['texte']}</p>";
//l'utilisation d'accolade dans un echo est possible grâce aux guillemets doubles, pas possible avec les simples guillemets, vous devez utiliser la concaténation suivante: '.$differenceDate['texte'].'
//on affiche le nombre de jours écoulé (ou le nombre de jours qu'il reste à passer):
//utilisation pour un compte à rebours:
if($differenceDate['invert']==0)
echo "<p>Disponible dans {$differenceDate['y']} an(s), {$differenceDate['m']} mois, {$differenceDate['d']} jour(s), {$differenceDate['h']} heure(s), {$differenceDate['i']} minute(s), {$differenceDate['s']} seconde(s)</p>";
else
echo "<p>La date est passé depuis {$differenceDate['days']} jour(s)!</p>";
//l'utilisation de if/else sans accolade est possible si vous mettez qu'une seule chose après if ou else, ici on a une chose (echo)


$differenceDate = differenceDate("1-4-2020 10:00","1-4-2120 10:00");
echo "<p>{$differenceDate['texte']}</p>";

$differenceDate = differenceDate(1588778845,1789889845);
echo "<p>{$differenceDate['texte']}</p>";

$differenceDate = differenceDate("1-4-2120 10:00",1789889845);
echo "<p>{$differenceDate['texte']}</p>";

$differenceDate = differenceDate(1588778845,"1-4-2120 10:00");
echo "<p>{$differenceDate['texte']}</p>";

A noter qu'on peut également s'en servir en compte à rebours PHP, si la date est dans le futur. (sera statique mais couplé à du JS on peut faire bouger la date une fois la page chargée)

Commentaires

lordbdp le 10 Mai 2020 à 00:59

Aurais-tu le code afin d'afficher l'âge d'un membre à partir de sa date de naissance (sur sgdb) ?
Merci pour tes codes ;)

admin le 10 Mai 2020 à 10:45

Bonjour,

non désolé, peut être voir la fonction EXTRACT() pour récupérer l'année et faire une simple soustraction avec l'année courante ?

admin le 10 Mai 2020 à 11:01

Voir la fonction AGE() (PostgreSQL)

Il y a un sujet ici: Calcul de l'age d'une personne - Développement SQL Server

Ajouter un commentaire

Pseudo/Nom *
Email *
Message *
La balise [code]Votre code...[/code] peut être utilisée

Captcha * memo2

Les champs marqués d'un * sont obligatoires.

Retour à la liste des scripts

Flag Counter