comment soustraire 2 dates

Eléphant du PHP | 65 Messages

13 janv. 2007, 22:42

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 :/

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

13 janv. 2007, 22:51

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 ?

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 65 Messages

13 janv. 2007, 22:54

Bin non sur google :roll:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

13 janv. 2007, 22:58

Mais tu as vu que j'ai donné un lien direct ?! 8-|

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 65 Messages

13 janv. 2007, 23:33

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 ?

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

14 janv. 2007, 00:59

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).

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 65 Messages

14 janv. 2007, 14:54

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!!!

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

14 janv. 2007, 15:39

DATEDIFF est une fonction SQL tu ne peut donc pas trouver plus optimisé :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 65 Messages

14 janv. 2007, 15:51

mmmh d'accord mais pourquoi ils n'ont pas fait un format de date universel au lieu de nous embrouiller le cerveau!!! :evil:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

14 janv. 2007, 15:54

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).

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 65 Messages

16 janv. 2007, 14:35

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();
}
?>
Modifié en dernier par abricot le 16 janv. 2007, 15:04, modifié 2 fois.

ViPHP
ViPHP | 1961 Messages

16 janv. 2007, 14:59

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" " "); 
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphant du PHP | 65 Messages

16 janv. 2007, 15:03

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.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

16 janv. 2007, 22:49

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.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute