Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Grâce à la doc officiel et aux différents sujet du forum j'ai réussi à débuter.
Mais arrivé à un point où je bloque.
J'ai dans une table une date d'insertion et une date (en mois) de fin de garantie.
Je sais afficher les date, mais je veux afficher combien de temps il reste avant la fin de la garantie. Une soustraction semble afficher quelque chose d'étrange.
Voici mon code.
<?php $date = new Zend_Date('2009 11 12','yyyy-MM-dd'); echo $date->get('yyyy-MM-dd'); //2009-11-12 -> OK $date->add($this->escape($this->item['item_warranty']),Zend_Date::MONTH); //chiffre en mois echo $date; //12 nov. 2012 00:00:00 -> OK (quoi que j'aimerai retier l'heure) $now = new Zend_Date(); echo $now . '<br/>'; //3 mars 2010 -> OK $fin = $date->get('yyyy-MM-dd') - $now->get('yyyy-MM-dd'); echo $fin; // 2 -> étrange !! ?>
Donc comme indiquer dans le code, la soustraction me donne '2'.
Je cherche le temps restant (année, mois, puis jours).
Voilà merci.
Dernière modification par maryooman (21-04-2010 15:51:11)
Hors ligne
Essaye ça, ça devrait te renvoyer la différence entre tes dates (en secondes)
$fin = $date->sub($now);
A+, Philippe
Hors ligne
et celà donne : 11 sept. 1972 10:33:57
je me doute qu'il est possible de faire beaucoup de choses avec, mais je ne vois pas comment
Hors ligne
Hello,
Cela vient de ta façon d'afficher mais moi je lis bien 2 ans 9 mois 11 jours et 10 h.
@+
Hors ligne
à part ça : echo $fin->get('yyyy-MM-dd'); qui me donne : 1972-09-11
je ne trouve pas, et même avec la doc sous le nez! : http://framework.zend.com/manual/fr/zen … rview.html
Hors ligne
Ce que tu récupères c'est un nombre de secondes. Le ZF considère ça comme un timestamp (c'est à dire un nombre de secondes depuis le 1er janvier 1970).
En fait quand tu soustrais 2 dates, tu n'obtiens pas une date, tu obtiens une durée, c'est normal que ça soit géré de façon un peu foireuse dans Zend_Date. (Zend_Date gère des dates et non des durées...)
Bref récupère le timestamp et divise le par 60*60*24 et tu obtiens un nombre de jours qui correspond...
A+, Philippe
PS : j'ai fait le test sur un ZF 1.8.1, là ça renvoyait directement un entier avec le nombre de secondes... ça a du changer depuis...
Hors ligne
en effet il renvoie un entier ...
je n'ai jamais programmé de date et je ne sais pas comment celà fonctionne.
le mystère reste entier pour moi ...
Hors ligne
Cet entier est un nombre de secondes qui correspond à la différence entre les 2 dates.
A+, Philippe
Hors ligne
j'ai trouvé sur le net une fonction qui me renvoi le temps qui reste et qui prends un timstamp unix.
function time_duration($seconds, $use = null, $zeros = false) { // Define time periods $periods = array ( 'years' => 31556926, 'Months' => 2629743, 'weeks' => 604800, 'days' => 86400, 'hours' => 3600, 'minutes' => 60, 'seconds' => 1 ); // Break into periods $seconds = (float) $seconds; foreach ($periods as $period => $value) { if ($use && strpos($use, $period[0]) === false) { continue; } $count = floor($seconds / $value); if ($count == 0 && !$zeros) { continue; } $segments[strtolower($period)] = $count; $seconds = $seconds % $value; } // Build the string foreach ($segments as $key => $value) { $segment_name = substr($key, 0, -1); $segment = $value . ' ' . $segment_name; if ($value != 1) { $segment .= 's'; } $array[] = $segment; } $str = implode(', ', $array); return $str; }
et puis je fais ça :
$date = new Zend_Date('2009 11 12','yyyy-MM-dd'); $date->add($this->escape($this->item['item_warranty']),Zend_Date::MONTH); $now = new Zend_Date(); $fin = $date->sub($now); $fin5 = $fin->toString("U"); echo time_duration($fin5). '<br/>';
et ça affiche :
2 years, 8 months, 1 week, 1 day, 13 hours, 32 minutes, 36 seconds
j'imagine que c'est déja implémenté dans Zend, mais j'ai pas trouvé.
Voilà
edit : comme je la trouve simpa cette fonction, pour ceux que ça intéraisse voici la source http://aidanlister.com/2004/04/making-t … -readable/
Dernière modification par maryooman (05-03-2010 11:03:19)
Hors ligne
Pages: 1