8721 sujets

Développement web côté serveur, CMS

Bonjour,

En PHP, je n'arrive pas à trouver comment faire simplement et proprement pour afficher le nombre de jours s'il est supérieur à 365 ou 366 en tenant compte des années bissextiles.

Par exemple : combien de jours entre le 01/05/1996 et 01/02/2008 ?

Pour l'instant c'est du pur bricolage pas bien propre.
Je transforme mes 2 timestamp en plusieurs variables : année, mois, jour
Je teste :
s'il y a des années bissextiles entre
si je suis avant ou après les 29 février possibles
j'ajoute, je retranche, j'ai un truc (je n'ose dire "code") d'environ 100 lignes avec des date('Y'),date('m'), des mktime et des strtotime en veux-tu en voilà ...

Existe t il une fonction PHP ou connaissez vous un script PHP simple et propre ?

Par avance Merci

le date('z') ne va pas au delà de 364.
$qs = strtotime('2002-01-01');
$az = strtotime('2001-01-01');
echo date('z',$qs - $az);

donne 0 au lieu de 365

$qs = strtotime('2005-01-01');
$az = strtotime('2004-01-01');
echo date('z',$qs - $az);

donne 1 au lieu de 366
Modérateur
Il n'existe pas de fonction toute faite mais c'est assez simple d'en écrire une, sachant qu'il y a toujours un 31 décembre.

function getYearDays($year){
  return (int) date('z', mktime(0,0,0,12,31,$year));
}
var_dump(getYearDays(2005));
var_dump(getYearDays('2004'));
var_dump(getYearDays(2003));
var_dump(getYearDays('2002'));
var_dump(getYearDays(2001));
Et en utilisant les secondes, sans ce préoccuper du nombre de jour par ans, quelque chose comme:
$qs = strtotime('2005-01-01');
$az = strtotime('2004-01-01');
echo round(($qs - $az)/(24*3600));
Modérateur
QuentinC a écrit :
Bien sûr qu'il y a des fonctions prévues pour ça.

Voir dans les classes standard de php5, par exemple ceci :
http://ch.php.net/manual/fr/datetime.diff.php

En même temps récupérer le nombre de jours au 31 décembre est plus simple que de créer deux instances d'objets date, de les soustraire et de récupérer le nombre de jours.
kustolovic a écrit :

En même temps récupérer le nombre de jours au 31 décembre est plus simple que de créer deux instances d'objets date, de les soustraire et de récupérer le nombre de jours.


La réponse de QuentinC me semble à première vue la plus propre, car elle répondrait simplement à mon exemple "combien de jours entre le 01/05/1996 et 01/02/2008 ?"

La réponse de matmat me convient tout à fait, car je n'ai pas à m'initier au fonctionnement des class et la POO. Faudra bien que je m'y mette un jour.

Je remercie kustolovic de m'avoir écrit une function, mais si elle allègerait quelque peu mon algo elle est loin d'être aussi pratique que les 2 autres propositions.

Je vais m'inspirer des réponses de QuentinC et de matmat pour résoudre un autre soucis de calcul et d'affichage sur les heures cette fois,
"comment afficher un nombre d'heure > 24 entre deux datetime, en tenant compte des changements heure d'été / heure d'hiver".
Par exemple : "combien d'heure il y a entre le 30/03/2013 12h10 et le 01/04/2013 12h50 et entre le 26/10/2013 12h10 et le 28/11/2013 12h50 ?"
A première vue le script de matmat ne serita pas juste... N'y a t il un autre moyen que de passer par les classes standard de php5 ?
Si je ne trouve pas, je créerai un nouveau post, et vos suggestions seront les bienvenues.
a écrit :
Je vais m'inspirer des réponses de QuentinC et de matmat pour résoudre un autre soucis de calcul et d'affichage sur les heures cette fois,
"comment afficher un nombre d'heure > 24 entre deux datetime, en tenant compte des changements heure d'été / heure d'hiver".
Par exemple : "combien d'heure il y a entre le 30/03/2013 12h10 et le 01/04/2013 12h50 et entre le 26/10/2013 12h10 et le 28/11/2013 12h50 ?"
A première vue le script de matmat ne serita pas juste... N'y a t il un autre moyen que de passer par les classes standard de php5 ?
Si je ne trouve pas, je créerai un nouveau post, et vos suggestions seront les bienvenues.

Là par contre pour le coup, je pense que soustraire bêtement les timestamp et diviser par 3600 donnera la bonne réponse sans avoir à s'amuser avec la POO. Les timestamp ne reflètent pas l'état heure d'été/heure d'hiver...
Par contre s'il faut seulement compter les heures de la journée p.ex. 8h-18h, tu es obligé de d'abord compter en jours avant de compter les jours incomplets.