Rechercher : dans
Par :

[PHP] Calcul du temps écoulé entre 2 dates

Dernière réponse le 23 sep 2009 à 10:34:49 freeman034, le 6 nov 2005 à 22:03:27 
 Signaler ce message aux modérateurs

Bonjour à tous,
Je voudrais savoir si quelqu'un peut m'aider à calculer le temps écoulé entre 2 dates, par exemple une date $date et le jour présent.

Je sais qu'il faut faire un timestamp pour les 2 dates après les convertir en secondes, les soustraires et les reconvertir en mois et années mais j'y arrive pas... quelqu'un peut me donner un exemple concrêt svp ? Merci !

Meilleures réponses pour « [PHP] Calcul du temps écoulé entre 2 dates » dans :
[PHP] Les ressemblances à ne pas confondre VoirIntroduction Concaténation ou paramètres ? Guillemets/Apostrophe Structure require/include isset vs empty htmlentities ou htmlspecialchars ? Nombre de signes égal Introduction Cette astuce présente plusieurs fonction ou astuces en php...
Télécharger PHP Edit VoirPHPEdit est un environnement de développement intégré (IDE) sous Windows pour le langage PHP. Il offre un grand nombre de fonctionnalités permettant de développer plus efficacement : Coloration syntaxique Auto-complétion des fonctions Débuggeur...
VBScript - Les fonctions de date et de temps VoirLes fonctions de date et de temps Fonction Description Date Retourne la date du système DateAdd(interval, number, date) Ajoute un intervalle de temps (interval) à une...

1

kilian, le 6 nov 2005 à 23:26:48

Salut,

Ca se passe avec mktime()
http://fr2.php.net/manual/en/function.mktime.php

Exemple, si tu fais:
mktime(0, 0, 0, 12, 55, 2005);

Ici, le 55 est le nombre pour les jours... Il ne devrait pas être superieur à 31, donc Php te convertira comme il faut, en ajoutant un mois et en faisant le bon calcul.

Ensuite avec date(), tu récupère comme tu veux ta date calculée, sachant que ton timestamp retourné par mktime doit être passé en deuxième argument de date(), ex:

$a=mktime(0, 0, 0, 12, 55, 2005);
echo date("Y",$a);

Ca affichera l'année...

Répondre à kilian

8

s.spark, le 3 jui 2009 à 14:39:51

Salut,

Tu calcules une date pas un écart de temps.

Répondre à s.spark

2

wiwimagique, le 7 nov 2005 à 10:06:23

Exacte

par contre, à ma connaissance, il n'y a pas une fonction qui te dit
que XXX secondes correspond à Y jours, Z heures, etc ....

A moins que quelqu'un ait une solution toute faite pour cela :-)

Dans sa voiture rouge et jaune

Répondre à wiwimagique

3

jisisv, le 7 nov 2005 à 10:32:19

Ca c'est du niveau école primaire
<?php
$XXX=1223456;
$sec=$XXX % 60;
$X=floor($XXX/60) ;
$min = $X %60 ;
$X = floor($X/60);
printf('%d hours, %d minutes, %d seconds\n', $X,$min,$sec);
?>

Tu évalueras de même, le nombre de jours( avec l'opérateur binaire % : reste de la division entière, a.k.a modulo). Pour les mois cela n'a pas beaucoup de sens.
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)

Répondre à jisisv

11

s.spark, le 15 jui 2009 à 15:21:08

C'est du niveau école primaire mais ton calcule est faux. Tu le dis toi même.

Répondre à s.spark

12

s.spark, le 15 jui 2009 à 16:24:57

Merde j'ai mélangé les serviettes et les torchons, voilà ce qui arrive quand on veut répondre à plusieurs sujet en même temps. Donc oui le calcule est bon bien sur, mais comme tu le dis il ne faut pas poursuivre ce raisonnement pour les mois.

Répondre à s.spark

4

freeman034, le 8 nov 2005 à 02:07:46

Ok ben j'ai essayé avec cette méthode mais bon elle marche pas est-ce que vous pouvez me dire où est l'erreur ?

La premiere fonction est sensée découper la date en jj mm et aaaa et après calculer avec la deuxieme fonction mais ça marche pas... quelqu'un peut m'aider svp ? Merci

<?

$date = '06/06/1994';





function date2timestamp($date)
{
list($day, $month, $year) = sscanf($date,"%d/%d/%d");
return mktime(0, 0, 0, $day, $month, $year);
}
echo date2timestamp($date);

function elapsed($day, $month, $year) {
  
  $todayMonth = date(n);
  $todayDay = date(j);
  $todayHour = date(G);
  $todayMinute = date(i);
  $monthday = date(nj);
  $link = $month.$day;
  $datepoint = $link;

  if ($monthday < $datepoint) $years = date(Y) - $year - 1;
  else $years = date(Y) - $year;
  if ($years < 1) $yearWord = '';
  elseif ($years == 1) $yearWord = 'year,';
  elseif ($years > 1) $yearWord = 'years,';
  if ($todayMonth > $month) {
    if ($todayDay < $day) $months = $todayMonth - $month -1;
    else $months = $todayMonth - $month;
  } else {
    $between = $month - $todayMonth;
    $plus = 12 - $month;
    if ($todayDay < $day) $months = $month + $plus - $between -1;
    else $months = $month + $plus - $between;
  }
  if ($months == 1) $monthWord = 'month,';
  elseif ($months > 1) $monthWord = 'months,';
  if ($todayDay > $day) {
    if ($todayHour < $hour) $days = $todayDay - $day -1;
    else $days = $todayDay - $day;
  } else {
    $between = $day - $todayDay;
    $daysToEndOfMonth = date(t) - $day;
    if (date(t) == 28) $plus = $daysToEndOfMonth;
    if (date(t) == 29) $plus = $daysToEndOfMonth;
    if (date(t) == 30) $plus = $daysToEndOfMonth;
    if (date(t) == 31) $plus = $daysToEndOfMonth;
    if ($todayHour < $hour) $days = $day + $plus - $between - 1;
    else $days = $day + $plus - $between;
  }
  if ($days == 1) $dayWord = 'day';
  else $dayWord = 'days';
  if ($todayHour > $hour) {
    if ($todayMinute < $minute) $hours = $todayHour - $hour - 1;
    else $hours = $todayHour - $hour;
  } else { 
    $between = $hour - $todayHour;
    $plus = 24 - $hour;
    if ($todayMinute < $minute) $hours = $hour + $plus - $between - 1;
    else $hours = $hour + $plus - $between;
  }
  if ($hours == 1) $hourWord = 'hour,';
  if ($hours > 1) $hourWord = 'hours,';
  if ($todayMinute > $minute) {
    $minutes = $todayMinute - $minute;
  } else { 
    $between = $minute - $todayMinute;
    $plus = 60 - $minute;
    $minutes = $minute + $plus - $between;
  }
  if ($minutes == 60) $minutes = 0;
  if ($minutes == 1) $minuteWord = 'minute';
  elseif ($minutes > 1) $minuteWord = 'minutes';
  if ($years == 0) { $years = ''; $yearWord = ''; }
  if ($months == 0) { $months = ''; $monthWord = ''; }
  if ($days == 0) { $days = ''; $dayWord = ''; }
  if ($hours == 0) { $hours = ''; $hourWord = ''; }
  if ($minutes == 0) { $minutes = ''; $minuteWord = ''; }
  echo $years.' '.$yearWord.' '.$months.'  '.$monthWord.' '.$days.' '.$dayWord.'';
}



date2timestamp($date);
elapsed($day, $month, $year);


?>

Répondre à freeman034

5

GallyNet, le 8 nov 2005 à 07:28:32
  • +1

ATTENTION, la fonction mktime à un ordre de paramètre bien précis :

int mktime ( [int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]] )

donc au lieu de faire:
return mktime(0, 0, 0, $day, $month, $year);

tu dois faire :
return mktime(0, 0, 0, $month, $day, $year);


ensuite (en fait, avant) tu fait :
list($day, $month, $year) = sscanf($date,"%d/%d/%d");

mais les varaibles $day, $month, $year ne font pas défini. Donc elle sont uilisé seulement dans la fonction. Hors, tu veut les uilisé plus tard en faisant :
elapsed($day, $month, $year);

dans un contexte global, donc ces variables n'ont pas de valeur.

Répondre à GallyNet

6

freeman034, le 8 nov 2005 à 17:43:56

Comment faire pour que les 3 variables précédemment utilisées dans la premiere fonction soient réutilisables dans la deuxieme ? L'idée était de découper la date en 3 puis des utiliser ensuite...

Répondre à freeman034

7

GallyNet, le 8 nov 2005 à 17:47:18

Pour, qu'a l'interrieur d'une fonction, tu utilise les variable qui sont a l'exterieur de la fonction il faut uiliser le mot clé "global" :

function maFonction(){
  global $maVariable;

  $maVariable=5
}


$maVariable=2;
maFonction();
echo $maVariable; // Affiche 5

Répondre à GallyNet

9

justedepassage, le 15 jui 2009 à 15:01:19

Le sujet correspond un peu à ma problématique. Les réponses données ne correspondent à pas grand chose...

Ayant deux dates (format yyyymmddhhiiss), la conversion par mktime est assez bancale et me décale le résultat d'un écart significatif...

Exemple : entre 20090710174718 et 20090709120313, on a bien 1 jour, 5h, 44min, 5sec lorsque le calclul est fait "à la main" et on obtient 1 jour, 4h, 44min, 6sec. Et oui, pour 1h06sec, c'est un bien grand écart...

Si par hasard quelqu'un avait une idée plus précise, je veux bien prendre une nouvelle solution !

Répondre à justedepassage

10

justedepassage, le 15 jui 2009 à 15:18:05

Après quelques jours de recherche, il suffisait de demander pour que la réponse puisse être trouvée...
Bref, pour ceux qui ont la même question, veuillez disséquer cette page : http://www.phpcs.com/codes/CALCUL-TEMPS-ECOULE-ENTRE-DATES_3­8828.aspx

Répondre à justedepassage

13

Bludwarf, le 23 sep 2009 à 10:20:21

Franchement je crois qu'il vaut mieux passer un peu de temps sur la doc PHP plutôt que se taper des lignes de code comme ça !

Il existe une méthode diff (de la classe DateTime) qui permet de calculer directement un intervalle. Après avec l'intervalle on peut récupérer ce qu'on veut : le nombre de jours, de secondes, etc.

Voilà un exemple d'utilisation avec des chaines du genre : '2009-06-08 20:30:00'


$d1 = new DateTime('2009-06-08 20:30:00');
$d2 = new DateTime('2009-06-10 20:30:00');
$diff = $d1->diff($d2);

$nb_jours = $diff->days;

Voilà j'espère que ça aura servit à quelqu'un ;)

Répondre à Bludwarf

14

 Bludwarf, le 23 sep 2009 à 10:34:49

Petit edit : Utilisez "d" à la place de "days()"

$nb_jours = $diff->d;

Répondre à Bludwarf