Calcul de date

Résolu/Fermé
JBA - 18 juin 2008 à 18:00
JB_A Messages postés 301 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 février 2018 - 20 juin 2008 à 14:33
Bonjour,

Je recherche de l'aide concernant un problème de date.
Je vous explique, j'ai une date du jour et une date de dépôt et je veux récupérer le nombre de jours, d'heures, de minutes (voire de secondes) séparant ces 2 dates.

En sachant que

$datejour=date("Y-m-d H:i:s"); //exemple de format retourné : 2008-06-18 17:44:25

$datedepot=$row[3]; // en sachant qu'il s'agit d'un champs de ma base de données et qu'il a le même format exemple : 2008-06-18 14:24:23

Si je fais $datejour-$datedepot, il me renvoie 0 car il ne fait la soustraction que sur l'année.
Décomposé $datejour et $datedepot en année, mois, jour, heures, minutes, secondes et les soustraire un par un ne résout pas réellement mon problème puisque par exemple si j'ai effectué un dépôt le mois précédent, il va considérer que je suis en avance d'un certain nombre de jour. exemple (29 jours - 11 jours = 18 jours alors qu'en fait, ils n'y en a que 11 jours + 2 à 3 jours en fonction des mois soit au maximum 14 jours).

J'ai essayé également d'utiliser le format mktime mais
1) je ne sais pas comment le retransformé par la suite
2) le format d'une date anterieur à la date du jour renvoi un chiffre supérieur à la date du jour donc renvoie un chiffre négatif.

Je vous remercie par avance de toute l'aide que vous pourriez m'apporter
A voir également:

8 réponses

macgawel Messages postés 664 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 1 novembre 2008 89
18 juin 2008 à 18:32
J'ai essayé également d'utiliser le format mktime mais
1) je ne sais pas comment le retransformé par la suite
2) le format d'une date anterieur à la date du jour renvoi un chiffre supérieur à la date du jour donc renvoie un chiffre négatif.

Bonjour.

mktime donne en sortie des secondes.
Il suffit donc de faire :
//3600 sec dans une heure, et 24 heures par jour.
// Je te laisse décomposer les dates pour récupérer h,min,sec jj, mm, aaaa ...
// Pour le cas où $datedepot > $datejour, on utilise abs()
$difference = abs(mktime($datejour) - mktime($datedepot)) * 3600 * 24;
0
Merci beaucoup Macgawel,

J'ai toujours un problème car il me renvoie toujours le même chiffre et ne le traduit pas en jours, heures, minutes.

$datejour=date("H,i,s m,d,Y");
$datedepot=substr($row[3],11,2).",".substr($row[3],14,2).",".substr($row[3],17,2)." ".substr($row[3],5,2).",".substr($row[3],8,2).",".substr($row[3],0,4);
$difference = abs(mktime($datejour) - mktime($datedepot)) * 3600 * 24;


// Résultats

19,19,54 06,18,2008($datejour) || 00,00,00 05,29,2008($datedepot) || 5909760000($difference)
19,19,54 06,18,2008($datejour) || 14,24,23 06,18,2008($datedepot) || 1555200000($difference)
19,19,54 06,18,2008($datejour) || 14,27,20 06,18,2008($datedepot) || 1555200000($difference)
19,19,54 06,18,2008($datejour) || 14,53,32 06,18,2008($datedepot) || 1555200000($difference)
...


Saurais-tu ce qui se passe ?

Merci de ta réponse
0
macgawel Messages postés 664 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 1 novembre 2008 89
18 juin 2008 à 19:28
// Je te laisse décomposer les dates pour récupérer h,min,sec jj, mm, aaaa ...

Extrait de la doc php :
Description

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

ATTENTION  : l'ordre des arguments est différent de celui de la commande UNIX habituelle mktime(), et fournit des résultats aléatoires si on oublie cet ordre. C'est une erreur très commune que de se tromper de sens. 

Tu ne passes pas les bons paramètres à mktime...
Il faut décomposer tes dates en $heure, $minutes, $secondes, $jour,$mois, $annee
0
Re-bonjour,

Cette fois, les résultats différent bien en fonction de la date mais la traduction en jours, heures, minutes ne se fait toujours pas.

De plus, pour des minutes assez proches (dans la même heure), le résultat n'évolue pas

19,41,23,18,06,2008($datejour) || 00,00,00,29,05,2008($datedepot) || 5909760000($difference)
19,41,23,18,06,2008($datejour) || 14,24,23,18,06,2008($datedepot) || 1555200000($difference)
19,41,23,18,06,2008($datejour) || 14,53,32,18,06,2008($datedepot) || 1555200000($difference)
...

Merci pour ton aide.
0
macgawel Messages postés 664 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 1 novembre 2008 89 > JBA
19 juin 2008 à 13:06
Tu peux mettre ton code ?
0
Mike-31 Messages postés 18357 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 6 février 2025 5 113
18 juin 2008 à 21:36
Salut,

Récupére sur ce lien un exemple tout simple qui détermine les jours, heures, minutes et secondes

https://www.cjoint.com/?gsvIzdbGyg

A+
0
Bonjour,

A quoi correspond ton script car il tente d'ouvrir un programme (excel semble-t-il), lorsqu'on clique sur le lien

@+
0
Mike-31 Messages postés 18357 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 6 février 2025 5 113
19 juin 2008 à 08:43
Ce lien est la merveille du forum et sert à échanger des exemples.

Tu cliques sur le lien qui va t'orienter vers un fichier joint que tu télécharges, dans ce cas je t'ai envoyé un fichier heures.xls

De même que tu peux nous envoyer un dossier qui te pose problème ce qui simplifi la compréention.

Garde sous le coude ce lien pour d'autres problèmes éventuels

https://www.cjoint.com/


A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
macgawel Messages postés 664 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 1 novembre 2008 89
19 juin 2008 à 13:21
J'ai regardé un peu...

A priori le champ de ta table est au format DATE.
$datedepot=$row[3];
echo $datedepot;

Ca te sort quoi ? Un nombre, ou une date (genre "2008-06-18 14:24:23") ?
Suivant les cas, il faudra convertir ta chaîne...
$datedepot=$row[3];
// Si on récupère une chaîne formatée
/ on la convertit. Sinon il n'y a pas besoin de la ligne qui suit.
$datedepot = strtotime($datedepot);
// On récupère le timestamp du moment
$datejour = strtotime("now");
// $diff contient la différence entre les deux dates, en secondes.
$diff = abs($datejour - $datedepot);
0
Bonjour et merci de vos réponses,

Désolé si j'ai été long à répondre mais j'avais un problème ADSL qui vient d'être résolu.

Je récapitule :

$datejour=date("H,i,s,m,d,Y");
$datej=mktime($datejour);

$datedepot=substr($row[3],11,2).",".substr($row[3],14,2).",".substr($row[3],17,2).",".substr($row[3],5,2).",".substr($row[3],8,2).",".substr($row[3],0,4);
$datedept=mktime($datedepot);

$dif=abs($datej-$datedept);

Mon problème est le suivant, il me semblait que mktime retourné le nombre de secondes qui sépare la date traduite du 1/1/1970 à 00:00:00.

Hors voici les résultats que j'obtiens :

15,52,25,06,19,2008 (datejour)// 00,00,00,05,29,2008 (datedepot)
1213883545 (datej : mktime) // 1213829545 (datedept : mktime) = 54000 (diff)

15,52,25,06,19,2008 (datejour)// 14,24,23,06,18,2008 (datedepot)
1213883545 (datej : mktime) // 1213879945 (datedept : mktime) = 3600 (diff)

15,52,25,06,19,2008 (datejour)// 14,27,20,06,18,2008 (datedepot)
1213883545 (datej : mktime) // 1213879945 (datedept : mktime) = 3600 (diff)

15,52,25,06,19,2008 (datejour)// 14,53,32,06,18,2008 (datedepot)
1213883545 (datej : mktime) // 1213879945 (datedept : mktime) = 3600 (diff)

...

Comme vous pouvez le voir la date de dépôt varie au niveau de la date et/ou au niveau de l'heure.
Néanmoins, le nombre de secondes (datedept avec mktime) ne varie pas. Je ne peux donc pas le retraduire en nombre de jours, minutes (et éventuellement de secondes).

Merci pour votre aide
0
macgawel Messages postés 664 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 1 novembre 2008 89
19 juin 2008 à 16:23
Rappel :
Extrait de la doc php :
Description
int mktime(int hour ,int minute ,int second ,int month ,int day ,int year ,[int is_dst ])
ATTENTION : l'ordre des arguments est différent de celui de la commande UNIX habituelle mktime(), et fournit des résultats aléatoires si on oublie cet ordre. C'est une erreur très commune que de se tromper de sens.

Tu ne passes pas les bons paramètres à mktime...
Il faut décomposer tes dates en $heure, $minutes, $secondes, $jour,$mois, $annee

Ton mktime, tu lui donnes en paramêtre une chaîne de caractères. C'est déjà beau que ça ne plante pas (en fait c'est le problème de php, qui fait un transtypage automatique...)

Après examen, ton $datedept=mktime($datedepot); est foireux :
$datedepot="00,00,00,05,29,2008";
$datedept=mktime($datedepot);
$tab_date = date("d/m/Y H:i:s", $datedept);
echo 'Datedept 1 : '.$datedept.'<br />'.'ToDate = '.$tab_date;

me retourne "19/06/2008 00:17:43".

Tu as regardéce message ?
0
JB_A Messages postés 301 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 février 2018 5
19 juin 2008 à 17:19
Re-bonjour,

Merci pour ton aide. Je viens de trouver une solution en décomposant les dates (Ci-dessous). Seul problème, j'ai un message d'erreur dans le cas d'une date avec heure à 00:00:00 parce que le mktime(00,00,00,1,1,1970) me renvoie -1 au lieu de 0.

---------------------------------------------------------------------------

Code :

$hf=date("H");//heure en cours
$mif=date("i");//minute en cours
$sf=date("s"); //seconde en cours
$jf=date("d");//aujourd'hui
$mf=date("m");//mois en cours
$af=date("Y");//année en cours


$hd=substr($row[3],11,2);//heure de dépôt
$mid=substr($row[3],14,2);//minute de dépôt
$sd=substr($row[3],17,2);//seconde de dépôt
$jd=substr($row[3],8,2);//jour de dépôt
$md=substr($row[3],5,2);//mois de dépôt
$ad=substr($row[3],0,4);//année de dépôt

// Traitement date de dépôt
$pd = mktime(0,0,0,$md,$jd,$ad);


// Traitement date en cours
$pf = mktime(0,0,0,$mf,$jf,$af);


//Structurations heures minutes et secondes
$tsd = mktime ($hd, $mid, $sd, 1, 1, 1970);
$tsf = mktime ($hf, $mif, $sf, 1, 1, 1970);
$ts = abs($tsf - $tsd);

// Extraction des valeurs attendues du Timestamp $ts
$nbj=abs($pf - $pd)/86400; // Nombre de jours écoulés
$nbh = floor($ts/3600); // Nombre d'heures écoulées

$ts = $ts - ($nbh*3600); // Soustrations du nombre de secondes définissables comme heure du total de secondes existant
$nbm = $ts/60; //Division de ce nombre de secondes par 60 pour en extraire celles définissables comme minute= Nombre de minutes écoulées
$nbm=floor($nbm); // Extraction Partie entière de la valeur nombre de minutes
$nbs=$ts-($nbm*60); //Soustrations du nombre de secondes définissables comme minutes du total de secondes restant : Le reste = nombre de secondes

------------------------------------------------

Pour afficher le résultat :

<? if ($nbj>"0") {?><? echo $nbj ?> jour<? if ($nbj>"1") {?>s<? } ?><? } ?><? if ($nbh>"0") {?> <? echo $nbh ?> heure<? if ($nbh>"1") {?>s<? } ?><? } ?><? if ($nbm>"0") {?> <? echo $nbm ?> minute<? if ($nbm>"1") {?>s<? } ?><? } ?>

--------------------------------------------------------

Résultats retournés :

21 jours 16 heures 9 minutes
1 jour 2 heures 44 minutes
1 jour 2 heures 41 minutes
1 jour 2 heures 15 minutes
...

On avance, c'est presque fini, il ne me reste plus que le message (à cause du -1) :

Warning: mktime(): Windows does not support negative values for this function in c:\web\www\it\support\incident\liste.php on line 199

Merci de votre patience et de votre aide
0
JB_A Messages postés 301 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 février 2018 5 > JB_A Messages postés 301 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 février 2018
19 juin 2008 à 17:58
La solution est de rajouter :

------------------------------------------------

if (($hf=="00") && ($mif=="00") && ($sf=="00")) {
$hf="1";
}

if (($hd=="00") && ($mid=="00") && ($sd=="00")) {
$hd="1";
}
--------------------------------------------------

Cela n'a pas l'air d'avoir d'impact sur le résultat final.


Merci à tous, et particulièrement à macgawel, pour votre aide.
0
JB_A Messages postés 301 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 février 2018 5
20 juin 2008 à 14:33
Ca y est tous les problèmes sont résolus.
Pour éviter la marge d'erreur de 1 heures, le script a été modifié

Je résume :

Effectuer la différence entre 2 dates ainsi que les heures (dans mon cas, la date/heure de dépôt d'un dossier et la date/heure du jour)

$row[3] correspond au résultat SQL d'une colonne de date (format MYSQL : DATE --> 0000-00-00 00:00:00)

-------------------------------------------------------------------------------

Script :

$hf=date("H");//heure de fin (dans mon cas, heure du jour)
$mif=date("i");//minute de fin (dans mon cas, minute du jour)
$sf=date("s"); //seconde de fin (dans mon cas, seconde du jour)
$jf=date("d");//jour de fin (dans mon cas, aujourd'hui)
$mf=date("m");//mois de fin (dans mon cas, mois en cours)
$af=date("Y");//année de fin (dans mon cas, année en cours)


$hd=substr($row[3],11,2);//heure de début (dans mon cas, heure de dépôt)
$mid=substr($row[3],14,2);//minute de début (dans mon cas, minute de dépôt)
$sd=substr($row[3],17,2);//seconde de début (dans mon cas, seconde de dépôt)
$jd=substr($row[3],8,2);//jour de début (dans mon cas, jour de dépôt)
$md=substr($row[3],5,2);//mois de début (dans mon cas, mois de dépôt)
$ad=substr($row[3],0,4);//année de début (dans mon cas, annee de dépôt)

// Traitement date et heure en cours
$pf = mktime($hf,$mif,$sf,$mf,$jf,$af);

// Traitement date et heure de dépôt
$pd = mktime($hd,$mid,$sd,$md,$jd,$ad);

// Différence entre les 2 dates
$ts=abs($pf-$pd);

//Transformation en nombre de jours
$nbj=floor($ts/86400); // Nombre de jours écoulés
$tp=$nbj*86400; // nombre de jours retransformés en secondes

//Transformation en nombre d'heures
$nbh=$ts - $tp; // nombre de seconde total - nombre de jours écoulés
$nbh = floor($nbh/3600); // Nombre d'heures écoulées
$td=$nbh*3600; // nombre d'heures retransformés en secondes

// transformation en nombre de minutes
$nbm=$ts-($tp+$td); // nombre de seconde total - nombre de jours écoulés + nombre d'heures écoulées
$nbm=floor($nbm/60); // nombre de minutes écoulées
$tf=$nbm*60; // nombre de minutes retransformés en secondes

// transformation en nombre de secondes
$nbs=$ts-($tp+$td+$tf); // nombre de seconde total - nombre de jours écoulés + nombre d'heures écoulées + nombre de minutes écoulées
$nbs=floor($nbs); // nombre de secondes écoulées


-------------------------------------------------------------------------------

Code d'affichage dans la page


<? if ($nbj>"0") {?><? echo $nbj ?> jour<? if ($nbj>"1") {?>s<? } ?><? } ?><? if ($nbh>"0") {?> <? echo $nbh ?> heure<? if ($nbh>"1") {?>s<? } ?><? } ?><? if ($nbm>"0") {?> <? echo $nbm ?> minute<? if ($nbm>"1") {?>s<? } ?><? } ?><? if ($nbs>"0") {?> <? echo $nbs ?> seconde<? if ($nbs>"1") {?>s<? } ?>


-------------------------------------------------------------------------------

Exemple de résultats affichés


22 jours 14 heures 14 minutes 51 secondes
1 jour 23 heures 47 minutes 31 secondes
1 jour 23 heures 43 minutes
4 heures 54 minutes 35 secondes
...


Voila, je pense que tout est terminé.

Bon courage à tous et merci pour votre aide.
0