787 votes

Trouver le nombre de jours entre deux dates

Comment trouver le nombre de jours entre deux dates en utilisant PHP ?

2 votes

26 votes

Une doublure : (new DateTime("2010-01-11"))->diff(new DateTime("2019-08-19"))->days;

0 votes

@billynoah - c'est la réponse la plus propre et la plus simple !

1102voto

Adnan Points 9393
$now = time(); // or your date as well
$your_date = strtotime("2010-01-31");
$datediff = $now - $your_date;

echo round($datediff / (60 * 60 * 24));

46 votes

Je pense que le retour d'un nombre négatif de jours fournit des informations pertinentes. Et vous devriez utiliser $your_date-$now si vous voulez qu'une date future renvoie un nombre entier positif.

25 votes

Qu'en est-il des secondes intercalaires ? Tous les jours n'ont pas exactement 24*60*60 secondes. Ce code peut être suffisant pour des raisons pratiques, mais il n'est pas exact dans certains cas extrêmement rares.

60 votes

Oubliez les secondes intercalaires (non, en fait, considérez-les aussi) mais cela ne tient PAS compte des changements d'heure d'été ! Elle peut être décalée d'un jour entier par rapport à ces limites chaque année. Vous devez utiliser les classes DateTime.

696voto

Saksham Gupta Points 1011

Si vous utilisez PHP 5.3 > Cette méthode est de loin la plus précise pour calculer la différence absolue :

$earlier = new DateTime("2010-07-06");
$later = new DateTime("2010-07-09");

$abs_diff = $later->diff($earlier)->format("%a"); //3

Si vous avez besoin d'un nombre relatif (signé) de jours, utilisez plutôt ceci :

$earlier = new DateTime("2010-07-06");
$later = new DateTime("2010-07-09");

$pos_diff = $earlier->diff($later)->format("%r%a"); //3
$neg_diff = $later->diff($earlier)->format("%r%a"); //-3

Plus d'informations sur le php's DateInterval peut être trouvé ici : https://www.php.net/manual/en/dateinterval.format.php

17 votes

Notez que, comme nous parlons d'intervalles de temps et non d'instants précis, la syntaxe du format est différente de celle de date() et de strftime(). La syntaxe des intervalles de temps peut être trouvée ici : php.net/manual/fr/dateinterval.format.php

2 votes

Ou dans mon cas le nombre de jours d'intervalle est $date2->diff($date1)->format("%a") - 1

15 votes

Gardez à l'esprit que si vous avez des heures dans vos dates, cela ne fonctionnera pas comme vous le souhaitez. Par exemple, si vous avez un intervalle de 23:30 heures... et qu'ils sont à des jours différents, la différence sera de 0.

196voto

Aditya Bhatt Points 3210

À partir de la version PHP 5.3 et plus, nouvelles fonctions date/heure ont été ajoutés pour obtenir la différence :

$datetime1 = new DateTime("2010-06-20");

$datetime2 = new DateTime("2011-06-22");

$difference = $datetime1->diff($datetime2);

echo 'Difference: '.$difference->y.' years, ' 
                   .$difference->m.' months, ' 
                   .$difference->d.' days';

print_r($difference);

Le résultat est le suivant :

Difference: 1 years, 0 months, 2 days

DateInterval Object
(
    [y] => 1
    [m] => 0
    [d] => 2
    [h] => 0
    [i] => 0
    [s] => 0
    [invert] => 0
    [days] => 367
)

J'espère que cela vous aidera !

8 votes

Oui, cela semble mieux que la réponse acceptée, qui ne fonctionne pas dans certains cas. Par exemple : $from='2014-03-01' ; $to='2014-03-31' ;

1 votes

Je suis d'accord, c'est si facile à suivre et ça marche très bien !!! N'oubliez pas d'utiliser la fonction date_default_timezone_set() ou vous obtiendrez des résultats étranges basés sur l'heure UTC.

2 votes

Cette fonction a échoué à 0 des 14603 tests effectués entre 1980 et 2020.

152voto

Tatu Ulmanen Points 52098

Convertissez vos dates en timestamps unix, puis soustrayez les uns des autres. Vous obtiendrez la différence en secondes, que vous diviserez par 86400 (nombre de secondes dans un jour) pour obtenir le nombre approximatif de jours dans cette plage.

Si vos dates sont au format 25.1.2010 , 01/25/2010 o 2010-01-25 vous pouvez utiliser l'option strtotime fonction :

$start = strtotime('2010-01-25');
$end = strtotime('2010-02-20');

$days_between = ceil(abs($end - $start) / 86400);

Utilisation de ceil arrondit le nombre de jours jusqu'au prochain jour complet. Utilisez floor à la place si vous voulez obtenir le nombre de jours complets entre ces deux dates.

Si vos dates sont déjà dans le format timestamp unix, vous pouvez sauter la conversion et faire simplement la fonction $days_between partie. Pour les formats de date plus exotiques, vous devrez peut-être effectuer une analyse personnalisée pour obtenir un résultat correct.

3 votes

@toon81 - nous utilisons Horodatage Unix pour éviter de tels désordres ! ;)

7 votes

Je m'explique : disons que ce matin à 3 heures, presque toute l'Europe a reculé son horloge d'une heure. Cela signifie que la journée d'aujourd'hui compte 3 600 secondes de plus, ce qui devrait se refléter dans les horodatages UNIX. Si c'est le cas, cela signifie qu'aujourd'hui comptera pour deux jours avec la méthode de calcul du nombre de jours décrite ci-dessus. Et je ne commence même pas à parler des secondes intercalaires puisque ni PHP ni UNIX ne semblent les prendre en compte (ce qui est compréhensible pour l'OMI). TL;DR : les journées ne durent pas toutes 86 400 secondes. .

2 votes

@toon81 Il n'y a PAS 3600 secondes de plus pour cette date. Rien du tout ne se produit dans l'horodatage UNIX lors du passage à l'heure d'été ou de l'heure d'hiver.

20voto

balaji Points 46

Utilisation facile de date_diff

$from=date_create(date('Y-m-d'));
$to=date_create("2013-03-15");
$diff=date_diff($to,$from);
print_r($diff);
echo $diff->format('%R%a days');

0 votes

Voici une bonne façon procédurale de le faire en utilisant la classe DateTime. Il manque seulement une utilisation claire de l'objet intervalle ( $diff dans ce cas). Quelque chose comme if ($diff->days > 30) { [doyourstuff]; }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X