par , 01/11/2020 � 15h03 (1189 Affichages)
Bonjour,
Avec DateTime, on se dit que c'est d'une facilit� d�concertante.
Eh bien pas tant que �a.
Car si je vous dis le 14 juillet, "Je vous livre vos courses dans un mois pile", vous m'attendrez de pied ferme le 14 ao�t.
Tandis que si je vous dis le 30 septembre, "Je vous livre vos courses dans un mois pile", vous n'aurez aucun moyen de savoir si cela veut dire "je vous les livre le 30 octobre, ou le 31 octobre"... les deux sont justes.
Pourquoi cela a-t-il sa petite importance ?
Car si vous tentez de soustraire un mois au 31/10, DateTime va soustraire 30 jours, et vous renvoyer le 1er octobre, tandis que vous attendiez le 30/09, de fa�on intuitive.
Voici donc par quel moyen contourner le probl�me, quelle que soit la date en param�tre.
Calculer la date du mois pr�c�dent
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?php
function return_one_month_earlier($cur_day){
$given_day= new DateTime($cur_day);
$given_day->modify('last day of');
$the_other_day = new DateTime($cur_day);
if($given_day==$the_other_day){
$the_other_day->modify('last day of -1 month');
}
else{
$the_other_day->modify('-1 month');
}
return $the_other_day;
}
$day='2020-12-31';//retournera '2020-11-30'
$day='1789-08-14';//retournera '1789-07-14'
$day='2008-01-31';//retournera '2007-12-31'
$day='2020-03-31';//retournera '2020-02-29'
echo $day.'<br/>';
$one_month_ago = return_one_month_earlier($day);
echo $one_month_ago->format('Y-m-d'); |
Explications de la fonction ci-dessus
- Le param�tre est un cha�ne de caract�res au format "YYYY-MM-DD".
- On va devoir cr�er 2 objets DateTime � partir de la m�me date (au d�part).
- Sur le premier objet $given_day, on le transforme pour aller chercher le dernier jour du mois fourni. ('last_day_of')
- Si le jour saisi ($the_other_day) est le dernier jour du mois saisi alors on va chercher le dernier jour du mois pr�c�dent.
- Sinon alors on retire un mois
- On retourne l'objet DateTime
Calculer la date du mois suivant
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?php
function return_one_month_later($cur_day){
$given_day= new DateTime($cur_day);
$given_day->modify('last day of');
$the_other_day = new DateTime($cur_day);
if($given_day==$the_other_day){
$the_other_day->modify('last day of next month');
}
else{
$the_other_day->modify('+1 month');
}
return $the_other_day;
}
//$day='2020-11-30';//retournera '2020-12-31'
$day='1789-07-14';//retournera '1789-08-14'
echo $day.'<br/>';
$one_month_later = return_one_month_later($day);
echo $one_month_later->format('Y-m-d'); |
Explications de la fonction ci-dessus
- Le param�tre est un cha�ne de caract�res au format "YYYY-MM-DD".
- On va devoir cr�er 2 objets DateTime � partir de la m�me date (au d�part).
- Sur le premier objet $given_day, on le transforme pour aller chercher le dernier jour du mois fourni. ('last_day_of')
- Si le jour saisi ($the_other_day) est le dernier jour du mois fourni alors on va chercher le dernier jour du mois suivant.
- Sinon on ajoute un mois
- On retourne l'objet DateTime