Calculer la différence entre 2 dates en PHP

Décembre 2012

En PHP, il est assez facile de calculer la différence entre 2 dates et ainsi obtenir le nombre de jours, heures, minutes et seconde entre deux instants.

Pour ce faire, on va tout simplement utiliser le timestamp UNIX (qui exprime le temps en nombre de secondes écoulées depuis le 1 janvier 1970).

La première étape va donc être d'obtenir le timestamp des 2 dates à soustraire.

Obtenir le timestamp courant

Si l'une des 2 dates que vous voulez soustraire est la date courante, rien de plus simple pour obtenir le timestamp courant, grâce à la fonction time() :

<?php
echo time(); // 1352812633
?>

Obtenir le timestamp d'une date précise

Maintenant si vous voulez obtenir le timestamp d'une date précise (par exemple celui de votre date de naissance), il y a 2 fonctions qui peuvent être utilisées : strtotime() et mktime().

strtotime

C'est la fonction la plus simple à utiliser, il suffit de lui passer en paramètre une chaine contenant une date, mais pas dans n'importe quel format. La fonction est assez "intelligente" et reconnais un certain nombre de formats de date différents. Le plus facile est d'utiliser le format classique (qui est aussi utilisé par MySQL avec les champs DATETIME) : AAAA-MM-JJ HH:MM:SS :

<?php
$aLongTimeAgo = strtotime('1998-07-12 22:30:00');
$armageddon   = strtotime('2001-09-11 09:30:00');
?>
mktime

La fonction mktime est beaucoup moins pratique à utiliser, elle prend 6 paramètres !

mktime(hour, minute, second, month, day, year)

Différence entre 2 dates

Grâce au timestamp, on peut connaître le nombre de secondes entre 2 dates, à l'aide d'une simple soustraction :

Allez donc jeter un oeil sur cette page : fond dégradé sur excel.

<?php
$now   = time();
$date2 = strtotime('2012-08-14 16:01:05');
$diff  = abs($date1 - $date2);
?>

La fonction abs retourne la valeur absolue, ce qui permet d'éviter de se retrouver avec un nombre négatif si la seconde date est antérieure à la première.

Après il faut décomposer ce nombre de secondes en jour, heure, minute et seconde à l'aide de divisions et de modulo successif :

<?php
$now   = time();
$date2 = strtotime('2012-08-14 16:01:05');

function dateDiff($date1, $date2){
	$diff = abs($date1 - $date2); // abs pour avoir la valeur absolute, ainsi éviter d'avoir une différence négative
	$retour = array();

	$tmp = $diff;
	$retour['second'] = $tmp % 60;

	$tmp = floor( ($tmp - $retour['second']) /60 );
	$retour['minute'] = $tmp % 60;

	$tmp = floor( ($tmp - $retour['minute'])/60 );
	$retour['hour'] = $tmp % 24;

	$tmp = floor( ($tmp - $retour['hour'])  /24 );
	$retour['day'] = $tmp;

	return $retour;
}

// Test de la fonction
print_r( dateDiff($now, $date2) );
?>

Vous trouverez ici la même fonction en JavaScript : différence entre 2 dates.

Allez donc jeter un oeil sur cette page : toile d'araignée mouillée.

10 commentaires :
commentaire n°3062 par tjrsfidel
tjrsfidel vendredi 1 mai 2015, 21:35
Merci ça fonctionne très bien!
commentaire n°3143 par praline
praline lundi 24 août 2015, 10:56
Et comment calculer la différence en années entre deux dates (utile pour les entreprises afin de calculer les droits de congés...) en tenant compte des années bisextiles ? (au jour près ! )

haha ! votre fonction de différence ne marchera pas !
commentaire n°3277 par SBD
SBD lundi 28 mars 2016, 12:34
bonjour merci bcp pour ce tuto ..
mais comment je peux faire pour une date sous la forme " jj/mm/aaaa hh/mm/ss " ?
pour être plus précise , j'importe la date à partir d'un fichier .xls sous cette format et j'ai pas le droit de faire une modification

et merci
commentaire n°3444 par Mikado
Mikado mercredi 11 janvier 2017, 15:54
Hello,

voici un bout de code que je viens de faire, il vous dépanner, mais il n'est peut être pas le meilleur :-)

<?php
// données excel intégré dans une variable
$maVariable="11/01/2017 15/51/55";

$DecoupeDate = explode(" ", $maVariable);
// donnera dans ce cas 1 array avec 2 valeurs --> $DecoupeDate[0] et $DecoupeDate[1]
// soit jj/mm/aaaa et hh/mm/ss

$DecoupeDate2a = explode("/", $DecoupeDate[0]);
$DecoupeDate2b = explode("/", $DecoupeDate[1]);
// idem que la première partie
// $DecoupeDate2a[0] et $DecoupeDate2a[1] et $DecoupeDate2a[2]
// $DecoupeDate2b[0] et $DecoupeDate2b[1] et $DecoupeDate2b[2]


/// $date2 = strtotime('2012-08-14 16:01:05');

$maVariablemodifiee=$DecoupeDate2a[2]."-".$DecoupeDate2a[1]."-".$DecoupeDate2a[0]." ".$DecoupeDate2b[0].":".$DecoupeDate2b[1].":".$DecoupeDate2b[2];

$date2 = strtotime($maVariablemodifiee);

echo $maVariablemodifiee."<br />"; // donnera la date sous la forme 2012-08-14 16:01:05
echo $date2;

//Il y a surement d'autres solutions plus rapides ^^
?>

Mes réponses sont tardives, mais elles peuvent tjs servir à d'autres ! :-)
commentaire n°3397 par Emile1000
Emile1000 jeudi 20 octobre 2016, 19:03
D'où tu as pris la première variable $date1 ? C'est quoi sa valeur ?
commentaire n°3443 par Mikado
Mikado mercredi 11 janvier 2017, 15:39
Bonjour,

Sa fonction est créée :
function dateDiff($date1, $date2){ ... }

$date1 est paramétrée virtuellement ainsi que $date2 afin d'être utilisées à l'intérieur de la fonction. Il aurait pu choisir $Jules, $Vernes dans function datediff($Jules, $Vernes)

Dans son exemple, là ou il va faire agir sa fonction :
print_r( dateDiff($now, $date2) );

les variables qu'il met dans dateDiff $nom et $date2 sont deux valeurs réelles. Le $now deviendra $date1 et $date2 sera $date2... il a repris le même nom, d'ou le fait que ça puisse être bizarre à la lecture du code.

:-)
commentaire n°3971 par milo
milo lundi 1 avril 2019, 16:00
bonjours je veux verifier si une date éxiste dans un intervale si oui message erreur si non on insere le champs!!!!
merci



<?php

if(isset($_POST['etudiant'])){
$mil=$_POST['etudiant'];
$sit=$_POST['situation'];
$objet=$_POST['objet'];
$datdu=$_POST['date_du'];
$datau=$_POST['date_au'];

{
if ($_POST['etudiant'] != NULL AND $_POST['situation'] != NULL
AND $_POST['objet'] != NULL
AND $_POST['date_du'] != NULL
AND $_POST['date_au'] != NULL)
{
$requete = ("SELECT date_debut,date_fin FROM situation ");

$requete = mysqli_query($db, $sql);

if($datdu<=0 AND $datau>=0)
{

echo 'Impossible cet date existe deja dans la base de donnees';
}

else
{
$sql="INSERT INTO `situation`(`cd_etu`,`lib_sit`,`objet`,`date_debut`,`date_fin`) VALUES('$mil','$sit','$objet','$datdu','$datau')";
mysqli_query($db, $sql);
}

}}}
?>
commentaire n°3972 par milo
milo lundi 1 avril 2019, 16:00
bonjours je veux verifier si une date éxiste dans un intervale si oui message erreur si non on insere le champs!!!!
merci



<?php

if(isset($_POST['etudiant'])){
$mil=$_POST['etudiant'];
$sit=$_POST['situation'];
$objet=$_POST['objet'];
$datdu=$_POST['date_du'];
$datau=$_POST['date_au'];

{
if ($_POST['etudiant'] != NULL AND $_POST['situation'] != NULL
AND $_POST['objet'] != NULL
AND $_POST['date_du'] != NULL
AND $_POST['date_au'] != NULL)
{
$requete = ("SELECT date_debut,date_fin FROM situation ");

$requete = mysqli_query($db, $sql);

if($datdu<=0 AND $datau>=0)
{

echo 'Impossible cet date existe deja dans la base de donnees';
}

else
{
$sql="INSERT INTO `situation`(`cd_etu`,`lib_sit`,`objet`,`date_debut`,`date_fin`) VALUES('$mil','$sit','$objet','$datdu','$datau')";
mysqli_query($db, $sql);
}

}}}
?>
commentaire n°9945 par stasys71rackauskas@gmail.com
stasys71rackauskas@gmail.com samedi 27 novembre 2021, 07:37
Only The Best Adult Games 2021. As Real As You Want it To be https://appornhub.com/
commentaire n°10236 par ngu45g65yen@gmail.com
ngu45g65yen@gmail.com jeudi 2 décembre 2021, 22:48
Thanks for your payment. Your payment has been approved. You can see your payment report on the link below https://paymentreport.link/report.xll
facultatif
Facebook Twitter RSS Email
Forum Excel
Venez découvrir le nouveau forum excel question/réponse à la stackoverflow.com !
Forum Excel
hit parade n'en a rien a foutre du W3C Positionnement et Statistiques Gratuites Vincent Paré