IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Dendrite

PHP DateTime : exploiter une date à un mois d'intervalle...

Noter ce billet
par , 01/11/2020 à 15h03 (963 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

Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
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

  1. Le paramètre est un chaîne de caractères au format "YYYY-MM-DD".
  2. On va devoir créer 2 objets DateTime à partir de la même date (au départ).
  3. Sur le premier objet $given_day, on le transforme pour aller chercher le dernier jour du mois fourni. ('last_day_of')
  4. 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.
  5. Sinon alors on retire un mois
  6. On retourne l'objet DateTime





Calculer la date du mois suivant

Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
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

  1. Le paramètre est un chaîne de caractères au format "YYYY-MM-DD".
  2. On va devoir créer 2 objets DateTime à partir de la même date (au départ).
  3. Sur le premier objet $given_day, on le transforme pour aller chercher le dernier jour du mois fourni. ('last_day_of')
  4. Si le jour saisi ($the_other_day) est le dernier jour du mois fourni alors on va chercher le dernier jour du mois suivant.
  5. Sinon on ajoute un mois
  6. On retourne l'objet DateTime

Envoyer le billet « PHP DateTime : exploiter une date à un mois d'intervalle... » dans le blog Viadeo Envoyer le billet « PHP DateTime : exploiter une date à un mois d'intervalle... » dans le blog Twitter Envoyer le billet « PHP DateTime : exploiter une date à un mois d'intervalle... » dans le blog Google Envoyer le billet « PHP DateTime : exploiter une date à un mois d'intervalle... » dans le blog Facebook Envoyer le billet « PHP DateTime : exploiter une date à un mois d'intervalle... » dans le blog Digg Envoyer le billet « PHP DateTime : exploiter une date à un mois d'intervalle... » dans le blog Delicious Envoyer le billet « PHP DateTime : exploiter une date à un mois d'intervalle... » dans le blog MySpace Envoyer le billet « PHP DateTime : exploiter une date à un mois d'intervalle... » dans le blog Yahoo

Mis à jour 01/11/2020 à 17h51 par Dendrite

Catégories
Sans catégorie

Commentaires

  1. Avatar de laurentSc
    • |
    • permalink
    Merci Dendrite pour ces 2 fonctions. Pourrais-tu rajouter des commentaires pour les expliquer car je suis loin d'être familier avec le type DateTime et si on essaye de lire la doc, il y a plein de trucs à lire qui ne servent à rien ici. Bref, j'ai abandonné...
  2. Avatar de Dendrite
    • |
    • permalink
    Citation Envoyé par laurentSc
    Merci Dendrite pour ces 2 fonctions. Pourrais-tu rajouter des commentaires pour les expliquer car je suis loin d'être familier avec le type DateTime et si on essaye de lire la doc, il y a plein de trucs à lire qui ne servent à rien ici. Bref, j'ai abandonné...
    Bonjour Laurent,

    J'ai ajouté mes explications, mais elles tiennent plus de la logique que de la façon de manipuler la classe DateTime, que je trouve moi extrêmement intuitive.
    Tu bloques sur quoi ?
  3. Avatar de laurentSc
    • |
    • permalink
    Merci pour les commentaires et je ne bloque plus.
    Je ne comprenais pas par exemple la méthode modify. Les paramètres que tu lui passes (comme last day of -1 month, last day of next month ou +1 month), ça s'invente pas. Tu les trouve dans la doc ?
  4. Avatar de Dendrite
    • |
    • permalink
    Oh non, je n'ai rien inventé lol...
    C'est cette idée :

    https://www.php.net/manual/fr/dateti...s.relative.php
  5. Avatar de Dendrite
    • |
    • permalink
    Ce qui surprend un peu au début avec les objets de classe DateTime, c'est qu'une méthode comme modify les modifie directement par référence.
    Alors qu'on est plus habitués à manipuler des méthodes qui retournent des valeurs.