Utilisez-le pour le code hérité (PHP <5.3). Pour une solution à jour, voir la réponse de jurka ci-dessous
Vous pouvez utiliser strtotime () pour convertir deux dates en heure unix, puis calculer le nombre de secondes entre elles. À partir de là, il est assez facile de calculer différentes périodes.
Edit: De toute évidence, la façon préférée de le faire est comme décrit par jurka ci-dessous. Mon code n'est généralement recommandé que si vous n'avez pas PHP 5.3 ou mieux.
Plusieurs personnes dans les commentaires ont souligné que le code ci-dessus n'est qu'une approximation. Je pense toujours que, dans la plupart des cas, c'est très bien, car l'utilisation d'une plage est plus pour donner une idée du temps qui s'est écoulé ou reste plutôt que pour fournir une précision - si vous voulez le faire, il suffit de sortir la date.
Malgré tout cela, j'ai décidé de répondre aux plaintes. Si vous avez vraiment besoin d'une plage exacte mais que vous n'avez pas accès à PHP 5.3, utilisez le code ci-dessous (il devrait également fonctionner en PHP 4). Il s'agit d'un port direct du code que PHP utilise en interne pour calculer les plages, à l'exception qu'il ne prend pas en compte l'heure d'été. Cela signifie qu'il est éteint d'une heure au plus, mais à part cela, il devrait être correct.
Si vous utilisez la classe DateTime, vous pouvez opter pour $ date-> format ('U') pour obtenir l'horodatage unix.
Jon Cram
4
Ce n'est pas vrai si vous devez composer avec l'heure d'été / d'hiver. Dans ce cas particulier, lorsque vous ajustez l'heure d'été / d'hiver, un jour équivaut à 23 ou 25 heures.
Arno
4
Eh bien, le même argument pourrait être avancé pour les années bissextiles. Il n'en tient pas compte non plus. Pourtant, je ne suis pas convaincu que vous souhaitiez même en tenir compte car nous discutons ici d'une gamme. La sémantique d'une plage est quelque peu différente de celle d'une date absolue.
Emil H
9
Cette fonction est incorrecte. C'est bon pour une approximation, mais incorrect pour des plages exactes. D'une part, il suppose qu'il y a 30 jours dans un mois, c'est-à-dire qu'il aura la même différence de jours entre le 1er février et le 1er mars que pour le 1er juillet au 1er août (quelle que soit l'année bissextile).
enobrev
1
En PHP, les variables de référence sont dans la signature de la fonction, pas dans l'appel. Déplacez tous vos &signatures.
Paul Tarjan
909
Je suggère d'utiliser des objets DateTime et DateInterval.
$date1 =newDateTime("2007-03-24");
$date2 =newDateTime("2009-06-26");
$interval = $date1->diff($date2);
echo "difference ". $interval->y ." years, ". $interval->m." months, ".$interval->d." days ";// shows the total amount of days (not divided into years, months and days like above)
echo "difference ". $interval->days ." days ";
+1 DateTime gère correctement les années bissextiles et les fuseaux horaires et il y a un bon livre pour l'étagère: phparch.com/books/…
hakre
3
Existe-t-il une méthode qui donne le nombre total de secondes entre les deux DateTimes? (sans additionner les composants, c'est-à-dire)
pomme de
1
@Panique Les $ interval-> jours et $ interval-> d sont des mesures différentes. votre commentaire ci-dessus est juste "montre le nombre total de jours (non divisé en années, mois et jours comme ci-dessus)"
notez qu'il y a un bogue où DateInterval a une propriété jours incorrecte ( toujours 6015 ) sous Windows avec certaines versions de PHP: bugs.php.net/bug.php?id=51184 (référez-vous aux commentaires pour correction / solution)
Pim Schaaf
73
La meilleure solution consiste à utiliser les objets PHP DateTime(et DateInterval). Chaque date est encapsulée dans un DateTimeobjet, puis une différence entre les deux peut être faite:
L' DateTimeobjet acceptera n'importe quel format strtotime(). Si un format de date encore plus spécifique est nécessaire, DateTime::createFromFormat()peut être utilisé pour créer leDateTime objet.
Une fois les deux objets instanciés, vous soustrayez l'un de l'autre avec DateTime::diff().
$difference = $first_date->diff($second_date);
$differencecontient maintenant un DateIntervalobjet avec les informations de différence. A var_dump()ressemble à ceci:
Nous avons un problème, échangeons first_date à second_date et nous obtenons le même résultat? Pourquoi ne pas dire 0 jours 0 heures 0 minutes 0 secondes ou seulement 0. Exemple: 2012-11-30 17:03:30 - 2012-12-21 00:00:00 et 2012-12-21 00:00:00 - 2012-11-30 17:03:30 obtenir le même résultat.
EgoistDeveloper
Parce que diff vous donne la différence entre les deux fois. La différence n'est pas 0 quelle que soit la date qui vient plus tard.
Madara's Ghost
1
C'est une très bonne réponse car elle fournit une fonction claire qui peut être appelée de n'importe où dans une base de code sans beaucoup de calculs de temps. D'autres réponses vous permettent de supprimer les calculs en écho à la volée qui répondent aux symptômes plutôt que de résoudre le problème ... Le seul élément que j'ai ajouté (et à peu près tous les autres articles ne couvrent pas cela) est la pluralisation des éléments $ interval si plus de 1.
nickhar
33
Afficher les heures et les minutes et les secondes.
Cela ne donnera probablement pas le résultat exact.
Dolphin
8
Et c'est une solution terrible à moins que vous ne soyez obligé d'utiliser une version terriblement obsolète de PHP ...
rdlowrey
2
Pas si SEC . Par exemple, 60 * 60 * 24 est répété 15 fois. Réutilisation du copier-coller longue durée!
Peter Mortensen
Et les années bissextiles? Une année n'est pas en moyenne 365 jours.
Peter Mortensen
Ce code suppose qu'un mois correspond à 30 jours en moyenne. Même en supposant 365 jours pour un an, un mois moyen est de 365/12 = 30,42 jours (environ).
Peter Mortensen
18
Jetez un œil au lien suivant. C'est la meilleure réponse que j'ai trouvée jusqu'à présent .. :)
function dateDiff ($d1, $d2){// Return the number of days between the two dates: return round(abs(strtotime($d1)- strtotime($d2))/86400);}// end function dateDiff
Peu importe la date antérieure ou ultérieure lorsque vous transmettez les paramètres de date. La fonction utilise la valeur absolue PHP ABS () pour toujours renvoyer un nombre positif comme le nombre de jours entre les deux dates.
Gardez à l'esprit que le nombre de jours entre les deux dates N'INCLUT PAS les deux dates. Donc, si vous recherchez le nombre de jours représentés par toutes les dates comprises entre les dates entrées, y compris, vous devrez ajouter un (1) au résultat de cette fonction.
Par exemple, la différence (telle que renvoyée par la fonction ci-dessus) entre 2013-02-09 et 2013-02-14 est 5. Mais le nombre de jours ou de dates représenté par la plage de dates 2013-02-09 - 2013-02- 14 est 6.
La question demandait la différence comme le nombre d'années, de mois et de jours, pas le nombre total de jours.
Peter Mortensen
14
J'ai voté pour Jurka de réponse que c'est mon préféré, mais j'ai une version pré-php.5.3 ...
Je me suis retrouvé à travailler sur un problème similaire - c'est ainsi que je suis arrivé à cette question en premier lieu - mais j'avais juste besoin d'une différence d'heures. Mais ma fonction a aussi bien résolu celui-ci et je n'ai nulle part dans ma propre bibliothèque pour le garder où il ne sera pas perdu et oublié, alors ... j'espère que cela sera utile à quelqu'un.
J'ai l'idée originale d' ici , que j'ai modifiée pour mes utilisations (et j'espère que ma modification s'affichera également sur cette page).
Vous pouvez très facilement supprimer les intervalles dont vous ne voulez pas (par exemple "semaine") en les supprimant du $aIntervalstableau, ou peut-être en ajoutant un $aExcludeparamètre, ou en les filtrant simplement lorsque vous sortez la chaîne.
Malheureusement, cela ne renvoie pas la même chose que DateInterval en raison de débordements année / mois.
Stephen Harris
2
@StephenHarris: Je n'ai pas testé cela, mais en lisant le code, je suis assez confiant qu'il devrait retourner le même résultat - à condition que vous supprimiez l' weekindex $aIntervals(car DateDiffn'utilise jamais cela).
Alix Axel
C'est une excellente solution pour trouver des dates qui se produisent à chaque intervalle entre deux dates.
cerveau
14
<?php
$today = strtotime("2011-02-03 00:00:00");
$myBirthDate = strtotime("1964-10-30 00:00:00");
printf("Days since my birthday: ",($today - $myBirthDate)/60/60/24);?>
La question demandait la différence en nombre d' années , de mois et de jours . Cela génère la différence en tant que nombre total de jours.
Peter Mortensen
11
Je ne sais pas si vous utilisez un framework PHP ou non, mais beaucoup de frameworks PHP ont des bibliothèques de date / heure et des aides pour vous empêcher de réinventer la roue.
Par exemple, CodeIgniter a la timespan()fonction. Entrez simplement deux horodatages Unix et cela générera automatiquement un résultat comme celui-ci:
ne semble pas fonctionner. J'ai une date au début de l'ère de l'horodatage.
Sirber
Il est important de comprendre que vous devez faire un $my_t["year"] -= 1970pour obtenir le bon nombre d'années. Vous devez également soustraire votre différence d'heure de GMT pour obtenir les bonnes heures. Vous devez également soustraire 1 du mois et de la date.
Salman A
6
// If you just want to see the year difference then use this function.// Using the logic I've created you may also create month and day difference// which I did not provide here so you may have the efforts to use your brain.// :)
$date1='2009-01-01';
$date2='2010-01-01';
echo getYearDifference ($date1,$date2);function getYearDifference($date1=strtotime($date1),$date2=strtotime($date2)){
$year =0;while($date2 > $date1 = strtotime('+1 year', $date1)){++$year;}return $year;}
"Strtotime ('+ 1 an', $ date1)" prend-il en compte les années bissextiles?
Peter Mortensen
6
C'est ma fonction. PHP requis> = 5.3.4. Il utilise la classe DateTime. Très rapide, rapide et peut faire la différence entre deux dates ou même le soi-disant "time since".
if(function_exists('grk_Datetime_Since')=== FALSE){function grk_Datetime_Since($From, $To='', $Prefix='', $Suffix=' ago', $Words=array()){# Est-ce qu'on calcul jusqu'à un moment précis ? Probablement pas, on utilise maintenantif(empty($To)=== TRUE){
$To = time();}# On va s'assurer que $From est numériqueif(is_int($From)=== FALSE){
$From = strtotime($From);};# On va s'assurer que $To est numériqueif(is_int($To)=== FALSE){
$To = strtotime($To);}# On a une erreur ?if($From === FALSE OR $From ===-1 OR $To === FALSE OR $To ===-1){return FALSE;}# On va créer deux objets de date
$From =newDateTime(@date('Y-m-d H:i:s', $From),newDateTimeZone('GMT'));
$To =newDateTime(@date('Y-m-d H:i:s', $To),newDateTimeZone('GMT'));# On va calculer la différence entre $From et $Toif(($Diff = $From->diff($To))=== FALSE){return FALSE;}# On va merger le tableau des noms (par défaut, anglais)
$Words = array_merge(array('year'=>'year','years'=>'years','month'=>'month','months'=>'months','week'=>'week','weeks'=>'weeks','day'=>'day','days'=>'days','hour'=>'hour','hours'=>'hours','minute'=>'minute','minutes'=>'minutes','second'=>'second','seconds'=>'seconds'), $Words);# On va créer la chaîne maintenantif($Diff->y >1){
$Text = $Diff->y.' '.$Words['years'];} elseif($Diff->y ==1){
$Text ='1 '.$Words['year'];} elseif($Diff->m >1){
$Text = $Diff->m.' '.$Words['months'];} elseif($Diff->m ==1){
$Text ='1 '.$Words['month'];} elseif($Diff->d >7){
$Text = ceil($Diff->d/7).' '.$Words['weeks'];} elseif($Diff->d ==7){
$Text ='1 '.$Words['week'];} elseif($Diff->d >1){
$Text = $Diff->d.' '.$Words['days'];} elseif($Diff->d ==1){
$Text ='1 '.$Words['day'];} elseif($Diff->h >1){
$Text = $Diff->h.' '.$Words['hours'];} elseif($Diff->h ==1){
$Text ='1 '.$Words['hour'];} elseif($Diff->i >1){
$Text = $Diff->i.' '.$Words['minutes'];} elseif($Diff->i ==1){
$Text ='1 '.$Words['minute'];} elseif($Diff->s >1){
$Text = $Diff->s.' '.$Words['seconds'];}else{
$Text ='1 '.$Words['second'];}return $Prefix.$Text.$Suffix;}}
Cela tentera de détecter si un horodatage a été donné ou non, et renverra également les dates / heures futures sous forme de valeurs négatives:
<?php
function time_diff($start, $end = NULL, $convert_to_timestamp = FALSE){// If $convert_to_timestamp is not explicitly set to TRUE,// check to see if it was accidental:if($convert_to_timestamp ||!is_numeric($start)){// If $convert_to_timestamp is TRUE, convert to timestamp:
$timestamp_start = strtotime($start);}else{// Otherwise, leave it as a timestamp:
$timestamp_start = $start;}// Same as above, but make sure $end has actually been overridden with a non-null,// non-empty, non-numeric value:if(!is_null($end)&&(!empty($end)&&!is_numeric($end))){
$timestamp_end = strtotime($end);}else{// If $end is NULL or empty and non-numeric value, assume the end time desired// is the current time (useful for age, etc):
$timestamp_end = time();}// Regardless, set the start and end times to an integer:
$start_time =(int) $timestamp_start;
$end_time =(int) $timestamp_end;// Assign these values as the params for $then and $now:
$start_time_var ='start_time';
$end_time_var ='end_time';// Use this to determine if the output is positive (time passed) or negative (future):
$pos_neg =1;// If the end time is at a later time than the start time, do the opposite:if($end_time <= $start_time){
$start_time_var ='end_time';
$end_time_var ='start_time';
$pos_neg =-1;}// Convert everything to the proper format, and do some math:
$then =newDateTime(date('Y-m-d H:i:s', $$start_time_var));
$now =newDateTime(date('Y-m-d H:i:s', $$end_time_var));
$years_then = $then->format('Y');
$years_now = $now->format('Y');
$years = $years_now - $years_then;
$months_then = $then->format('m');
$months_now = $now->format('m');
$months = $months_now - $months_then;
$days_then = $then->format('d');
$days_now = $now->format('d');
$days = $days_now - $days_then;
$hours_then = $then->format('H');
$hours_now = $now->format('H');
$hours = $hours_now - $hours_then;
$minutes_then = $then->format('i');
$minutes_now = $now->format('i');
$minutes = $minutes_now - $minutes_then;
$seconds_then = $then->format('s');
$seconds_now = $now->format('s');
$seconds = $seconds_now - $seconds_then;if($seconds <0){
$minutes -=1;
$seconds +=60;}if($minutes <0){
$hours -=1;
$minutes +=60;}if($hours <0){
$days -=1;
$hours +=24;}
$months_last = $months_now -1;if($months_now ==1){
$years_now -=1;
$months_last =12;}// "Thirty days hath September, April, June, and November" ;)if($months_last ==9|| $months_last ==4|| $months_last ==6|| $months_last ==11){
$days_last_month =30;}elseif($months_last ==2){// Factor in leap years:if(($years_now %4)==0){
$days_last_month =29;}else{
$days_last_month =28;}}else{
$days_last_month =31;}if($days <0){
$months -=1;
$days += $days_last_month;}if($months <0){
$years -=1;
$months +=12;}// Finally, multiply each value by either 1 (in which case it will stay the same),// or by -1 (in which case it will become negative, for future dates).// Note: 0 * 1 == 0 * -1 == 0
$out =new stdClass;
$out->years =(int) $years * $pos_neg;
$out->months =(int) $months * $pos_neg;
$out->days =(int) $days * $pos_neg;
$out->hours =(int) $hours * $pos_neg;
$out->minutes =(int) $minutes * $pos_neg;
$out->seconds =(int) $seconds * $pos_neg;return $out;}
"si" la date est stockée dans MySQL, je trouve plus facile de faire le calcul de la différence au niveau de la base de données ... Ensuite, en fonction des sorties Jour, Heure, Min, Sec, analyser et afficher les résultats selon le cas ...
J'ai trouvé votre article sur la page suivante, qui contient un certain nombre de références pour les calculs de date et d'heure PHP .
Calculez la différence entre deux dates (et l'heure) en utilisant PHP. La page suivante fournit une gamme de méthodes différentes (7 au total) pour effectuer des calculs de date / heure à l'aide de PHP, pour déterminer la différence de temps (heures, munites), jours, mois ou années entre deux dates.
Vous pouvez également utiliser le code suivant pour renvoyer la différence de date par des fractions rondes jusqu'à $ date1 = $ duedate; // attribue l'échéance echo $ date2 = date ("Ymd"); // date actuelle $ ts1 = strtotime ($ date1); $ ts2 = strtotime ($ date2); $ seconds_diff = $ ts1 - $ ts2; echo $ dateiff = ceil (($ seconds_diff / 3600) / 24); // retour en jours
Si vous utilisez la méthode de plancher de php au lieu de plafond, cela vous renverra la fraction ronde. Veuillez vérifier la différence ici, parfois si le fuseau horaire de vos serveurs de transfert est différent, le fuseau horaire du site en direct dans ce cas, vous pouvez obtenir des résultats différents, modifiez donc les conditions en conséquence.
J'ai eu le même problème avec PHP 5.2 et l'ai résolu avec MySQL. Peut-être pas exactement ce que vous cherchez, mais cela fera l'affaire et renverra le nombre de jours:
Puisque tout le monde publie des exemples de code, voici une autre version.
Je voulais une fonction pour afficher les différences de quelques secondes à plusieurs années (une seule unité). Pour les périodes de plus d'un jour, je voulais qu'il se déroule à minuit (10h lundi vu de 9h mercredi il y a 2 jours, pas 1). Et pour des périodes de plus d'un mois, je voulais que le roulement se fasse le même jour du mois (y compris pour les mois 30/31 jours et les années bissextiles).
Voici ce que j'ai trouvé:
/**
* Returns how long ago something happened in the past, showing it
* as n seconds / minutes / hours / days / weeks / months / years ago.
*
* For periods over a day, it rolls over at midnight (so doesn't depend
* on current time of day), and it correctly accounts for month-lengths
* and leap-years (months and years rollover on current day of month).
*
* $param string $timestamp in DateTime format
* $return string description of interval
*/function ago($timestamp){
$then = date_create($timestamp);// for anything over 1 day, make it rollover on midnight
$today = date_create('tomorrow');// ie end of today
$diff = date_diff($then, $today);if($diff->y >0)return $diff->y.' year'.($diff->y>1?'s':'').' ago';if($diff->m >0)return $diff->m.' month'.($diff->m>1?'s':'').' ago';
$diffW = floor($diff->d /7);if($diffW >0)return $diffW.' week'.($diffW>1?'s':'').' ago';if($diff->d >1)return $diff->d.' day'.($diff->d>1?'s':'').' ago';// for anything less than 1 day, base it off 'now'
$now = date_create();
$diff = date_diff($then, $now);if($diff->d >0)return'yesterday';if($diff->h >0)return $diff->h.' hour'.($diff->h>1?'s':'').' ago';if($diff->i >0)return $diff->i.' minute'.($diff->i>1?'s':'').' ago';return $diff->s.' second'.($diff->s==1?'':'s').' ago';}
Cette réponse est tout aussi fausse que la réponse de Khaldonno. Il suppose (cas 10) qu'une année a 365 jours (chaque quatrième année a 366 jours (sauf pour les règles de 100 ans / 400 ans pour le calendrier grégorien)), et qu'un mois a 30 jours (c'est environ 30,42 jours environ). les années non bissextiles). Même avec de meilleures constantes, il n'est correct qu'en moyenne, pas nécessairement correct pour deux dates particulières.
Peter Mortensen, le
3
Très simple:
<?php
$date1 = date_create("2007-03-24");
echo "Start date: ".$date1->format("Y-m-d")."<br>";
$date2 = date_create("2009-06-26");
echo "End date: ".$date2->format("Y-m-d")."<br>";
$diff = date_diff($date1,$date2);
echo "Difference between start date and end date: ".$diff->format("%y years, %m months and %d days")."<br>";?>
Veuillez vérifier le lien suivant pour plus de détails:
Il exécute deux boucles; le premier traite des intervalles relatifs (années et mois) via le forçage brut, et le second calcule les intervalles absolus supplémentaires avec une arithmétique simple (donc c'est plus rapide):
Réponses:
Vous pouvez utiliser strtotime () pour convertir deux dates en heure unix, puis calculer le nombre de secondes entre elles. À partir de là, il est assez facile de calculer différentes périodes.
Edit: De toute évidence, la façon préférée de le faire est comme décrit par jurka ci-dessous. Mon code n'est généralement recommandé que si vous n'avez pas PHP 5.3 ou mieux.
Plusieurs personnes dans les commentaires ont souligné que le code ci-dessus n'est qu'une approximation. Je pense toujours que, dans la plupart des cas, c'est très bien, car l'utilisation d'une plage est plus pour donner une idée du temps qui s'est écoulé ou reste plutôt que pour fournir une précision - si vous voulez le faire, il suffit de sortir la date.
Malgré tout cela, j'ai décidé de répondre aux plaintes. Si vous avez vraiment besoin d'une plage exacte mais que vous n'avez pas accès à PHP 5.3, utilisez le code ci-dessous (il devrait également fonctionner en PHP 4). Il s'agit d'un port direct du code que PHP utilise en interne pour calculer les plages, à l'exception qu'il ne prend pas en compte l'heure d'été. Cela signifie qu'il est éteint d'une heure au plus, mais à part cela, il devrait être correct.
la source
&
signatures.Je suggère d'utiliser des objets DateTime et DateInterval.
en savoir plus php DateTime :: diff manual
Du manuel:
la source
$date2->format('U') - $date1->format('U')
.La meilleure solution consiste à utiliser les objets PHP
DateTime
(etDateInterval
). Chaque date est encapsulée dans unDateTime
objet, puis une différence entre les deux peut être faite:L'
DateTime
objet acceptera n'importe quel formatstrtotime()
. Si un format de date encore plus spécifique est nécessaire,DateTime::createFromFormat()
peut être utilisé pour créer leDateTime
objet.Une fois les deux objets instanciés, vous soustrayez l'un de l'autre avec
DateTime::diff()
.$difference
contient maintenant unDateInterval
objet avec les informations de différence. Avar_dump()
ressemble à ceci:Pour formater l'
DateInterval
objet, nous devons vérifier chaque valeur et l'exclure si elle est 0:Il ne reste plus qu'à appeler notre fonction sur l'
$difference
DateInterval
objet:Et nous obtenons le résultat correct:
Le code complet utilisé pour atteindre l'objectif:
la source
DateTime()
n'est pas une fonction, c'est un objet, et il est là depuis PHP 5.2. Assurez-vous que votre serveur le prend en charge.Afficher les heures et les minutes et les secondes.
la source
Jetez un œil au lien suivant. C'est la meilleure réponse que j'ai trouvée jusqu'à présent .. :)
http://www.bizinfosys.com/php/date-difference.html
la source
J'ai voté pour Jurka de réponse que c'est mon préféré, mais j'ai une version pré-php.5.3 ...
Je me suis retrouvé à travailler sur un problème similaire - c'est ainsi que je suis arrivé à cette question en premier lieu - mais j'avais juste besoin d'une différence d'heures. Mais ma fonction a aussi bien résolu celui-ci et je n'ai nulle part dans ma propre bibliothèque pour le garder où il ne sera pas perdu et oublié, alors ... j'espère que cela sera utile à quelqu'un.
Et le test:
Et le résultat:
J'ai l'idée originale d' ici , que j'ai modifiée pour mes utilisations (et j'espère que ma modification s'affichera également sur cette page).
Vous pouvez très facilement supprimer les intervalles dont vous ne voulez pas (par exemple "semaine") en les supprimant du
$aIntervals
tableau, ou peut-être en ajoutant un$aExclude
paramètre, ou en les filtrant simplement lorsque vous sortez la chaîne.la source
week
index$aIntervals
(carDateDiff
n'utilise jamais cela).la source
Je ne sais pas si vous utilisez un framework PHP ou non, mais beaucoup de frameworks PHP ont des bibliothèques de date / heure et des aides pour vous empêcher de réinventer la roue.
Par exemple, CodeIgniter a la
timespan()
fonction. Entrez simplement deux horodatages Unix et cela générera automatiquement un résultat comme celui-ci:http://codeigniter.com/user_guide/helpers/date_helper.html
la source
Exemple d'utilisation:
Production :
Une fonction :
la source
J'ai une logique simple pour cela:
la source
Vous pouvez utiliser le
fonction qui retourne un tableau contenant tous les éléments de la date / heure fournie:
Si vos dates de début et de fin sont au format chaîne, utilisez
avant le code ci-dessus
la source
$my_t["year"] -= 1970
pour obtenir le bon nombre d'années. Vous devez également soustraire votre différence d'heure de GMT pour obtenir les bonnes heures. Vous devez également soustraire 1 du mois et de la date.la source
C'est ma fonction. PHP requis> = 5.3.4. Il utilise la classe DateTime. Très rapide, rapide et peut faire la différence entre deux dates ou même le soi-disant "time since".
la source
Je préfère utiliser
date_create
etdate_diff
objets.Code:
Production:
Pour plus d'informations, lisez le
date_diff
manuel PHPla source
Cela tentera de détecter si un horodatage a été donné ou non, et renverra également les dates / heures futures sous forme de valeurs négatives:
Exemple d'utilisation:
Ou:
la source
"si" la date est stockée dans MySQL, je trouve plus facile de faire le calcul de la différence au niveau de la base de données ... Ensuite, en fonction des sorties Jour, Heure, Min, Sec, analyser et afficher les résultats selon le cas ...
la source
J'ai trouvé votre article sur la page suivante, qui contient un certain nombre de références pour les calculs de date et d'heure PHP .
Calculez la différence entre deux dates (et l'heure) en utilisant PHP. La page suivante fournit une gamme de méthodes différentes (7 au total) pour effectuer des calculs de date / heure à l'aide de PHP, pour déterminer la différence de temps (heures, munites), jours, mois ou années entre deux dates.
Voir PHP Date Time - 7 méthodes pour calculer la différence entre 2 dates .
la source
Vous pouvez également utiliser le code suivant pour renvoyer la différence de date par des fractions rondes jusqu'à $ date1 = $ duedate; // attribue l'échéance echo $ date2 = date ("Ymd"); // date actuelle $ ts1 = strtotime ($ date1); $ ts2 = strtotime ($ date2); $ seconds_diff = $ ts1 - $ ts2; echo $ dateiff = ceil (($ seconds_diff / 3600) / 24); // retour en jours
Si vous utilisez la méthode de plancher de php au lieu de plafond, cela vous renverra la fraction ronde. Veuillez vérifier la différence ici, parfois si le fuseau horaire de vos serveurs de transfert est différent, le fuseau horaire du site en direct dans ce cas, vous pouvez obtenir des résultats différents, modifiez donc les conditions en conséquence.
la source
la source
vous pouvez toujours utiliser la fonction suivante qui peut renvoyer l'âge en années et mois (c'est-à-dire 1 an 4 mois)
ou si vous voulez que l'âge soit calculé à la date actuelle, vous pouvez utiliser
la source
Pour la version php> = 5.3: Créez deux objets de date puis utilisez la
date_diff()
fonction. Il renverra l' objet php DateInterval . voir la documentationla source
Voici le code exécutable
la source
J'ai eu le même problème avec PHP 5.2 et l'ai résolu avec MySQL. Peut-être pas exactement ce que vous cherchez, mais cela fera l'affaire et renverra le nombre de jours:
Plus d'informations ici http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff
la source
Puisque tout le monde publie des exemples de code, voici une autre version.
Je voulais une fonction pour afficher les différences de quelques secondes à plusieurs années (une seule unité). Pour les périodes de plus d'un jour, je voulais qu'il se déroule à minuit (10h lundi vu de 9h mercredi il y a 2 jours, pas 1). Et pour des périodes de plus d'un mois, je voulais que le roulement se fasse le même jour du mois (y compris pour les mois 30/31 jours et les années bissextiles).
Voici ce que j'ai trouvé:
la source
Il y a quelque temps, j'ai écrit une
format_date
fonction car cela donne de nombreuses options sur la façon dont vous voulez votre date :la source
Très simple:
Veuillez vérifier le lien suivant pour plus de détails:
PHP: date_diff - Manuel
Notez que c'est pour PHP 5.3.0 ou supérieur.
la source
Une fonction simple
Utilisez comme
echo time_difference ($time_1, $time_2, "day");
Reviendra comme
2 years 8 months 2 days
la source
Essayez cette réponse très simple en utilisant date_diff () , elle est testée.
la sortie est:
la source
J'utilise la fonction suivante que j'ai écrite, quand PHP 5.3 (respectivement date_diff ()) n'est pas disponible:
la source
DateInterval
est super mais il a quelques mises en garde:Pour surmonter cela, j'ai codé ce qui suit (amélioré par rapport à la réponse @enobrev ):
Il exécute deux boucles; le premier traite des intervalles relatifs (années et mois) via le forçage brut, et le second calcule les intervalles absolus supplémentaires avec une arithmétique simple (donc c'est plus rapide):
la source