par , 01/11/2020 à 16h03 (1043 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