Page 1 sur 1

comment soustraire 2 dates

Posté : 13 janv. 2007, 22:42
par abricot
Salut tout le monde :shock:

J'ai cherché un peu partout sur le net et tous les exemples que j'ai trouvé sont très mal expliqués.
Je voudrais savoir comment soustraire 2 dates pour trouver le nombre de jours qui les sépares, en gros je voudrais faire ca :

$date1 = date("20 10 2000");
$date2 = date("d m Y");

et soustraire les deux pour avoir le nombre de jours qui les séparent.

J'ai vu que beaucoups utilise un timestamp je trouve ca completement idiot de soustraire des millions de secondes pour avoir un resultat et en plus j'ai rien compris :/

Re: comment soustraire 2 dates

Posté : 13 janv. 2007, 22:51
par Truc
Salut,
Salut tout le monde :shock:
ça te choque à ce point d'être poli et saluer :lol:
J'ai cherché un peu partout sur le net
Dans la FAQ du forum aussi ?

Posté : 13 janv. 2007, 22:54
par abricot
Bin non sur google :roll:

Posté : 13 janv. 2007, 22:58
par Truc
Mais tu as vu que j'ai donné un lien direct ?! 8-|

Posté : 13 janv. 2007, 23:33
par abricot
oups desolé je n'ai pas fais gaffe, merci infiniment! donc le code est :
<?php 
$date = Array('annee'=>1982, 'mois'=>05, 'jour'=>01); // la date de départ 
$aujourdhui = time(); // le timestamp d'aujourd'hui 

$time = mktime(0, 0, 0, $date['mois'], $date['jour'], $date['annee']); // la date de départ est passée en secondes 
$ecart = $aujourdhui - $time; // soustraction => nombre de secondes de la différence 
$ecart = floor($ecart / 3600 / 24); // on repasse en nombre de jours 
echo $ecart.' jours<br />'; 
$ecart = floor($ecart / 365); // on repasse en années 
echo $ecart.' années'; 
?>  
Mais je ne comprend vraiment pas pourquoi on utilise un tableau dans cet exemple! Ca serais plus simple de faire $time = mktime(0,0,0,12,24,2007); non ?

Posté : 14 janv. 2007, 00:59
par Truc
Le tableau n'est la que pour bien montrer où placer les paramètres (repérable aux indices).

Sinon pour avoir le timestamp "$time" tu peux passer par strtotime() en passant en argument la date comparer.

Autre solution DATEDIFF, extraire la différence entre deux dates depuis la requête (si la date provient d'une BD).

Posté : 14 janv. 2007, 14:54
par abricot
recoucou,

Je trouve que c'est vraiment pas optimisé cette histoire! Je m'explique.

Si je fais un mktime() je dois presenter ma date sous cette forme : mois, jour, année.

Si je prend la date de ma table sql elle se présente comme ceci : année, mois, jour.

Donc je dois encore faire une conversion avec datediff si je veux la traiter avec mktime()? Je trouve que c'est du n'importe quoi!!!

Posté : 14 janv. 2007, 15:39
par Truc
DATEDIFF est une fonction SQL tu ne peut donc pas trouver plus optimisé :wink:

Posté : 14 janv. 2007, 15:51
par abricot
mmmh d'accord mais pourquoi ils n'ont pas fait un format de date universel au lieu de nous embrouiller le cerveau!!! :evil:

Posté : 14 janv. 2007, 15:54
par Truc
Il est universel le format
YYYY-MM-DD (aaaa-mm-jj)

C'est juste que mktime() demande un ordre de passage des pramètres différent (sans conséquences).

Posté : 16 janv. 2007, 14:35
par abricot
Merci truc, désolé pour le retard!
Je suis en train de creer un petit programme inutile, je déposerais les sources une fois terminé pour que vous me dites si j'aurais pu faire mieux!
J'adore programmer mais des fois c'est franchement bisare je m'explique :
<?php
// sqldate.php
mysql_connect("localhost", "nanana", " ");
mysql_select_db("nana_db");
$query = mysql_query("SELECT DATE_FORMAT(date, '%m,%d,%Y') as date FROM nana");
$array = mysql_fetch_array($query);
?>
<?php
// date.php
require ("sqldate.php");

if (!empty($array['date'])){
          while($array = mysql_fetch_array($query)){
          $date1 = $array['date'];
          list($mois,$jour,$annee) = explode(',', $date1);
          $date2 = time();
          $date3 = date(d m Y);

          $mktime = mktime(0,0,0,$mois,$jour,$annee);
          $mkresult = $date2 - $mktime;
          $mkresult = floor($mkresult / 3600);
      
          echo 'Il y a '.$mkresult.' heures entre le '.$jour.' '.$mois.' '.$annee.' et (aujourd\'hui) le '.$date3.'';
          }
     }
else {
die();
}
?>
Quelqu'un pourrait m'expliquer pourquoi ca ne marche pas si je met mon while derrière un IF, et pourquoi ca ne marche pas non plus si $array existe déjà avant de commencer la boucle?
Pour que ca marche je dois faire comme ca:
// sqldate.php
<?php
mysql_connect("localhost", "nanana", " ");
mysql_select_db("nana_db");
$query = mysql_query("SELECT DATE_FORMAT(date, '%m,%d,%Y') as date FROM nana");
?>
<?php
// date.php
require ("sqldate.php");
         
while($array = mysql_fetch_array($query)){
     $date1 = $array['date'];
     list($mois,$jour,$annee) = explode(',', $date1);
     $date2 = time();
     $date3 = date(d m Y);

     $mktime = mktime(0,0,0,$mois,$jour,$annee);
     $mkresult = $date2 - $mktime;
     $mkresult = floor($mkresult / 3600);
      
     echo 'Il y a '.$mkresult.' heures entre le '.$jour.' '.$mois.' '.$annee.' et (aujourd\'hui) le '.$date3.'';
}

else {
die();
}
?>

Posté : 16 janv. 2007, 14:59
par Ajoloca
Bonjour,

Je crois que ni le premier, ni le deuxième fonctionnent.

Une fonction PHP qui reçoit plusieurs paramètres, comme c'est le cas de mysql_connect(),
elle les attend séparés par des virgules. C'est pas le cas
mysql_connect("localhost" "nanana" " "); 

Posté : 16 janv. 2007, 15:03
par abricot
Bonjour,

Je crois que ni le premier, ni le deuxième fonctionnent.

Une fonction PHP qui reçoit plusieurs paramètres, comme c'est le cas de mysql_connect(),
elle les attend séparés par des virgules. C'est pas le cas
mysql_connect("localhost" "nanana" " "); 
Coucou, excuse moi faute de frappe, j'ai fais le script à la volée, je vais rectifier ca de suite.

Posté : 16 janv. 2007, 22:49
par Truc
que est ce qui ne marche pas au juste ?

Tu fait un mysql_fetch_*
Un test if sur le fetch_* précédent
Puis un nouveau fetch_*, si tu n'as qu'un tuple dans la base de données alors tu ne passeras pas ce test du while et tu sors sans passer par la case départ et sans rien afficher.