Page 1 sur 1

Prob avec date et mktime et le mois de février !

Posté : 30 mars 2009, 22:44
par jeremm
Salut,

Est-ce un bug ou je ne sais quoi, voilà la source :
echo date("M Y", mktime(0, 0, 0, date("m")-2, date("d"),   date("Y")));  // retourne : Jan 2009

echo date("M Y", mktime(0, 0, 0, date("m")-1, date("d"),   date("Y")));   // retourne : Mar 2009

echo date("M Y", mktime(0, 0, 0, date("m"), date("d"),   date("Y")));   // retourne : Mar 2009

// config : easyphp 3.0

Il ne veut pas m'afficher le mois de Février.. surement parceque entre le 28 et le 31 mars, si on fait un mois précédent, on arrive entre le 28 et 31 Février, et là PHP refuse d'afficher car ça n'existe pas et affiche le mois suivant..
Idem pour quand on sera le 31 d'un mois, le mois précédent ne s'affichera pas s'il ne comporte que 30 jours..

Est-ce un bug ? Y'a t'il un workaround ? quand on veut afficher le mois précédent quand on est au mois de mars ?
J'ai pensé à forcer le date("d") en 15 par exemple pour etre sur de tomber tous les mois sur le 15 du mois précédent, qui lui existe bien, mais bon c'est pas très propre ?

Merci.

Posté : 31 mars 2009, 01:29
par @rthur
Bonjour,

Je ne vois absolument pas de bug, tu demande à mktime de te créer une date correcte en lui passant en paramètre le "30 février 2009", le plus logique est effectivement qu'il te retourne le 2 mars 2009.

Si tu cherches à obtenir le mois précédent, alors fixe le jour dans ton mktime au 1er du mois et ainsi plus de problème :
echo date("M Y", mktime(0, 0, 0, date("m")-2, 1,   date("Y")));  // retourne : Jan 2009

echo date("M Y", mktime(0, 0, 0, date("m")-1, 1,   date("Y")));   // retourne : Feb 2009

echo date("M Y", mktime(0, 0, 0, date("m"), 1,   date("Y")));   // retourne : Mar 2009

Posté : 31 mars 2009, 08:53
par jeremm
yep, c'est ce que je proposais de faire mais j'avais peur que ca ne soit pas très propre de forcer une date..
bref merci ;)

Posté : 31 mars 2009, 09:14
par julian
Le mktime prend les paramètres séparemment donc si un paramètre n'est pas bon, il ne calcul pas le timestamp. A mon avis, le plus simple est de prendre le timestamp d'aujourd'hui, et de soustraire 30 jours.
$today = time();
$one_month_ago = $today - 86400 * 30;